// Консоль запросов 9000 v 1.1.11
// (C) Александр Кузнецов 2019-2020
// hal@hal9000.cc
//Минимальная версия платформы 8.3.12, минимальный режим совместимости 8.3.8

#Область ОписаниеПеременных

&НаКлиенте
Перем СигнатураКонсоли;
&НаКлиенте
Перем ВерсияФормата;
&НаКлиенте
Перем РасширениеФайлов;
&НаКлиенте
Перем ФильтрСохранения;
&НаКлиенте
Перем РасширениеАвтосохранения;
&НаКлиенте
Перем ФлагУдаленФайлАвтосохранения;//для ЗагрузитьПакетЗапросовПослеВопроса
&НаКлиенте
Перем ФлагУдаленФайлСостояния;//для ЗагрузитьПакетЗапросовПослеВопроса

&НаКлиенте
Перем УИ_РедакторКодаКлиентскиеДанные Экспорт;

//Типы контейнера в ПараметрахЗапроса: 0 - нет, 1 - список значений, 2 - массив, 3 - таблица значений.

#КонецОбласти

#Область ОбработчикиСобытийФормы

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	РасширениеФайлов = "q9";
	СигнатураКонсоли = ИмяОбработкиКонсоли(ЭтотОбъект);
	ФильтрСохранения = "Файл запросов (*." + РасширениеФайлов + ")|*." + РасширениеФайлов;
	РасширениеАвтосохранения = "q9save";
	ВерсияФормата = 13;
		
	//Если Доступность выключить в веб-клиенте при создании на сервере, она работает по другому, чем для обычных клиентов.
	//Поэтому только так.
	Доступность = Ложь;

#Если ВебКлиент Тогда

	Оповещение = Новый ОписаниеОповещения("ПослеЗавершенияПодключенияРасширенияРаботыСФайлами", ЭтотОбъект);
	НачатьПодключениеРасширенияРаботыСФайлами(Оповещение);

	ОтобразитьСостояниеВыполненияАлгоритма();

#Иначе

		ОтобразитьСостояниеВыполненияАлгоритма();
		ПриОткрытииПродолжение();

#КонецЕсли

КонецПроцедуры

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

	ОбъектОбработки = РеквизитФормыВЗначение("Объект");
	ОбъектОбработки.Инициализация(ЭтаФорма);
	ЗначениеВРеквизитФормы(ОбъектОбработки, "Объект");

	ЗапросВКонструкторе = -1;
	РедактируемыйЗапрос = -1;
	ОпцияПериодОпросаВключенияВыключенияТехнологическогоЖурнала = 3;
	
	//ИспользуемоеИмяФайла = РеквизитФормыВЗначение("Объект").ИспользуемоеИмяФайла;

	Элементы.ВременныеТаблицыЗначение.КартинкаКнопкиВыбора = БиблиотекаКартинок.Изменить;

	Объект.Заголовок = "Консоль запросов 9000 v" + Объект.ВерсияОбработки;

	МакроПараметр = "__";
	
	//Это нужно для правильной отрисовки области результата запроса до его выполнения.
	маДобавляемыеРеквизиты = Новый Массив;
	Реквизит = Новый РеквизитФормы("Пустой", Новый ОписаниеТипов, "РезультатЗапроса");
	маДобавляемыеРеквизиты.Добавить(Реквизит);
	ИзменитьРеквизиты(маДобавляемыеРеквизиты);
	Элемент = Элементы.Добавить("Пустой", Тип("ПолеФормы"), Элементы.РезультатЗапроса);
	Элемент.ПутьКДанным = "РезультатЗапроса.Пустой";
	Элемент.ОтображатьВШапке = Ложь;

	СуффиксРеквизитаКонтейнера=ОбъектОбработки.СуффиксРеквизитаКонтейнера();

#Область УИ_ПриСозданииНаСервере
	УИ_ВходитВСоставУниверсальныхИнструментов = ОбъектОбработки.ОбработкаВходитВСоставУниверсальныхИнструментов();
	Если УИ_ВходитВСоставУниверсальныхИнструментов Тогда
		УИ_ОбщегоНазначения.ФормаИнструментаПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка,
			Элементы.КоманднаяПанельФормыПраво);

		Объект.Заголовок="";
		Заголовок="";
		АвтоЗаголовок=Истина;
		Элементы.ПакетЗапросовПодменюПерехват.Видимость=Ложь;
		Элементы.ГруппаКоманднаяПанельЗапросаПраваяПерехват.Видимость=Ложь;
		Элементы.КоманднаяПанельВидРезультата.ЦветФона=Новый Цвет;

		Элементы.УИ_РедактироватьЗначение.Видимость=Истина;
		Элементы.РезультатЗапросаКонтекстноеМенюУИ_РедактироватьЗначение.Видимость=Истина;
		Элементы.РезультатЗапросаДеревоКонтекстноеМенюУИ_РедактироватьЗначение.Видимость=Истина;

		УИ_ЗаполнитьДаннымиОтладки();
		
		УИ_ЗаполнитьЗапросыИзСКД();

		УИ_РедакторКодаСервер.ФормаПриСозданииНаСервере(ЭтотОбъект);

		УИ_РедакторКодаСервер.СоздатьЭлементыРедактораКода(ЭтотОбъект,
														   "Алгоритм",
														   Элементы.ТекстАлгоритм,
														   ,
														   ,
														   Элементы.ГруппаАлгоритмКоманднаяПанельРедактораКода);
		УИ_РедакторКодаСервер.СоздатьЭлементыРедактораКода(ЭтотОбъект,
														   "АлгоритмПередВыполнением",
														   Элементы.ТекстАлгоритмПередВыполнением,
														   ,
														   , Элементы.ГруппаАлгоритмПередВыполнениемКоманднаяПанель);
		УИ_РедакторКодаСервер.СоздатьЭлементыРедактораКода(ЭтотОбъект,
														   "Запрос",
														   Элементы.ТекстЗапроса,
														   ,
														   "bsl_query",
														   Элементы.ГруппаКоманднаяПанельЗапроса);
		
		УИ_ЕстьПодсистемаЗарплатаКадры = УИ_ОбщегоНазначения.ПодсистемаСуществует("ЗарплатаКадрыПодсистемы");
		Если Не УИ_ЕстьПодсистемаЗарплатаКадры Тогда
			Элементы.УИ_ГруппаЗапросКомандыРаботыСПредставлениями.Видимость = Ложь;
			Элементы.УИ_ГруппаАлгоритмПередВыполнениемКомандыРаботыСПредставлениями.Видимость = Ложь;	
		КонецЕсли;
	КонецЕсли;
#КонецОбласти

	ПодсказкаАлгоритмаПередВыполнением = "Доступны переменные: мЗапрос (Тип-Запрос)";
КонецПроцедуры

&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)

#Если ВебКлиент Тогда
	Если Не РасширениеДляРаботыСФайламиПодключено Тогда
		Возврат;
	КонецЕсли;
#КонецЕсли

	Если ЗавершениеРаботы = Истина Тогда
		
		//Тут серверные вызовы запрещены. Максимум, что можно сделать - это предупреждения.

		ТекстПредупреждения = "";
		Если Модифицированность Тогда
			//Тут будет предупреждение о не сохраненном запросе.
			ТекстПредупреждения = "В консоли запросов 9000 имеется не сохраненный пакет запросов! ";
			Отказ = Истина;
		КонецЕсли;

		Если Элементы.ТехнологическийЖурнал.Пометка Тогда
			ТекстПредупреждения = ТекстПредупреждения + "Технологический журнал не выключен! ";
			Отказ = Истина;
		КонецЕсли;

		Если Не ЗначениеЗаполнено(ТекстПредупреждения) Тогда
			//Лучше всегда консоль закрывать руками, для сохранения состояния.
			ТекстПредупреждения = "Для сохранения состояний консоль запросов 9000 рекомендуется закрывать вручную.";
			Отказ = Истина;
		КонецЕсли;

	Иначе
		
		//Сохраним состояние.
		ПакетЗапросов_Сохранить( , ИмяФайлаАвтосохраненияСостояния, Истина);

		Если Не СохранитьСВопросом("Завершение") Тогда
			Отказ = Истина;
		КонецЕсли;

		Если Не Отказ И Элементы.ТехнологическийЖурнал.Пометка Тогда
			Команда_ТехнологическийЖурнал(Неопределено);
		КонецЕсли;

	КонецЕсли;

КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура ОпцияСохранятьКомментарииПриИзменении(Элемент)
	Модифицированность = Истина;
КонецПроцедуры

&НаКлиенте
Процедура ОпцияОбрабатывать__ПриИзменении(Элемент)
	Модифицированность = Истина;
КонецПроцедуры

&НаКлиенте
Процедура ОпцияИнтервалАвтосохраненияПриИзменении(Элемент)
	ПодключитьОбработчикАвтосохранения();
	Модифицированность = Истина;
КонецПроцедуры

&НаКлиенте
Процедура ОпцияИнтервалОбновленияВыполненияАлгоритмаПриИзменении(Элемент)
	Модифицированность = Истина;
КонецПроцедуры

&НаКлиенте
Процедура ОпцияОграничениеВыводимыхСтрокВклПриИзменении(Элемент)
	УстановитьСостоянияЭлементов();
КонецПроцедуры

&НаКлиенте
Процедура ОпцияОграничениеВыводимыхСтрокПервыеВклПриИзменении(Элемент)
	УстановитьСостоянияЭлементов();
КонецПроцедуры

&НаКлиенте
Процедура ТекстЗапросаПриИзменении(Элемент)
	ПоместитьРедактируемыйЗапрос();
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыПакетЗапросов

&НаКлиенте
Процедура ПакетЗапросовВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	ВыполнитьЗапрос(Ложь);
	СтандартнаяОбработка = Ложь;
КонецПроцедуры

&НаКлиенте
Процедура ПакетЗапросовПриАктивизацииСтроки(Элемент)

	ТекущиеДанные = Элементы.ПакетЗапросов.ТекущиеДанные;

	Если Элементы.ПакетЗапросов.ТекущаяСтрока = РедактируемыйЗапрос Тогда
		Возврат;
	КонецЕсли;

	Если ТекущиеДанные <> Неопределено И Не ТекущиеДанные.Инициализирован Тогда
		ИнициализироватьЗапрос(Элементы.ПакетЗапросов.ТекущиеДанные);
		ИзвлечьРедактируемыйЗапрос( , Ложь);
	Иначе
		ИзвлечьРедактируемыйЗапрос();
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ПакетЗапросовПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)

	Если Копирование Тогда

		Отказ = Истина;

		ТекущаяСтрока = ПакетЗапросов.НайтиПоИдентификатору(Элементы.ПакетЗапросов.ТекущаяСтрока);
		Родитель = ТекущаяСтрока.ПолучитьРодителя();
		Если Родитель = Неопределено Тогда
			Родитель = ТекущаяСтрока;
		КонецЕсли;

		НоваяСтрока = Родитель.ПолучитьЭлементы().Добавить();
		ЗаполнитьЗначенияСвойств(НоваяСтрока, ТекущаяСтрока);
		Элементы.ПакетЗапросов.ТекущаяСтрока = НоваяСтрока.ПолучитьИдентификатор();

	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ПакетЗапросовПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
	СтароеЗначениеИмяПараметра = "";
КонецПроцедуры

&НаКлиенте
Процедура ПакетЗапросовПередОкончаниемРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования, Отказ)

	ИмяЗапроса = Элемент.ТекущиеДанные.Имя;

	Строка = НайтиВДереве(ПакетЗапросов, "Имя", ИмяЗапроса, Элемент.ТекущаяСтрока);
	Если Строка <> Неопределено Тогда
		ПоказатьПредупреждениеКонсоли("Запрос с таким именем уже есть! Введите другое имя.");
		Отказ = Истина;
		Возврат;
	КонецЕсли;

КонецПроцедуры


#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыПараметрыЗапроса

&НаКлиенте
Процедура ПараметрыЗапросаПриАктивизацииСтроки(Элемент)
	УстановитьПараметрыВводаЗначения();
КонецПроцедуры

&НаКлиенте
Процедура ПараметрыЗапросаПередОкончаниемРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования, Отказ)
	
	ОбработатьИзменениеИмениПараметра(НоваяСтрока, ОтменаРедактирования, Отказ);

КонецПроцедуры

&НаКлиенте
Процедура ПараметрыЗапросаПриИзменении(Элемент)
	ПоместитьРедактируемыйЗапрос();
КонецПроцедуры

&НаКлиенте
Процедура ПараметрыЗапросаТипПараметраНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

	СтандартнаяОбработка = Ложь;
	ТекущиеДанные = Элементы.ПараметрыЗапроса.ТекущиеДанные;

	Если ТекущиеДанные.ТипКонтейнера < 3 Тогда
		ТипЗначения = ТекущиеДанные.ТипЗначения;
	Иначе
		ТипЗначения = ТекущиеДанные.Контейнер;
	КонецЕсли;

	ПараметрыОповещения = Новый Структура("Таблица, Строка, Поле", "ПараметрыЗапроса",
		Элементы.ПараметрыЗапроса.ТекущаяСтрока, "ТипЗначения");
	ОписаниеОповещенияОЗакрытииОткрываемойФормы = Новый ОписаниеОповещения("ОкончаниеРедактированияСтроки", ЭтаФорма,
		ПараметрыОповещения);
	ПараметрыОткрытия = Новый Структура("Объект, ТипЗначения, ТипКонтейнера, Имя, ВЗапросРазрешено", Объект,
		ТипЗначения, ТекущиеДанные.ТипКонтейнера, ТекущиеДанные.Имя, Истина);
	ОткрытьФорму(ПолноеИмяФормы("РедактированиеТипа"), ПараметрыОткрытия, ЭтаФорма, Истина, , ,
		ОписаниеОповещенияОЗакрытииОткрываемойФормы, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

КонецПроцедуры

&НаКлиенте
Процедура ПараметрыЗапросаЗначениеПриИзменении(Элемент)

	ТекущиеДанные = Элементы.ПараметрыЗапроса.ТекущиеДанные;

	Если ТекущиеДанные.ТипКонтейнера = 0 Тогда

		ТекущиеДанные.Контейнер = ТекущиеДанные.Значение;
		Если Не ЗначениеЗаполнено(ТекущиеДанные.ТипЗначения) Тогда
			ТекущиеДанные.ТипЗначения = ОписаниеТиповПоТипу(ТипЗнч(ТекущиеДанные.Значение));
		КонецЕсли;

	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ПараметрыЗапросаЗначениеОчистка(Элемент, СтандартнаяОбработка)

	ТекущиеДанные = Элементы.ПараметрыЗапроса.ТекущиеДанные;

	Если ТекущиеДанные.ТипКонтейнера = 0 Тогда
		чКоличествоТипов = ТекущиеДанные.ТипЗначения.Типы().Количество();
		Если чКоличествоТипов = 0 Или чКоличествоТипов > 1 Тогда
			ТекущиеДанные.Значение = Неопределено;
		Иначе
			ТекущиеДанные.Значение = ТекущиеДанные.ТипЗначения.ПривестиЗначение(Неопределено);
		КонецЕсли;
	ИначеЕсли ТекущиеДанные.ТипКонтейнера = 3 Тогда
	КонецЕсли;

	УстановитьПараметрыВводаЗначения();

КонецПроцедуры

&НаКлиенте
Процедура ПараметрыЗапросаЗначениеОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных,
	СтандартнаяОбработка)
	ТекущиеДанные = Элементы.ПараметрыЗапроса.ТекущиеДанные;
	Если ТипЗнч(ТекущиеДанные.Контейнер) = Тип("Структура") И ТекущиеДанные.Контейнер.Тип = "УникальныйИдентификатор" Тогда
		Попытка
			Значение = Новый УникальныйИдентификатор(Текст);
		Исключение
			ВызватьИсключение "Не корректное значение уникального идентификатора";
		КонецПопытки;
		ПараметрыЗапроса_СохранитьЗначение(Элементы.ПараметрыЗапроса.ТекущаяСтрока, Значение);
		СтандартнаяОбработка = Ложь;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПараметрыЗапросаЗначениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

	ТекущиеДанные = Элемент.Родитель.ТекущиеДанные;

	Если ТекущиеДанные.ТипКонтейнера > 0 Тогда

		СтандартнаяОбработка = Ложь;
		ПараметрыОповещения = Новый Структура("Таблица, Строка, Поле", "ПараметрыЗапроса",
			Элемент.Родитель.ТекущаяСтрока, "Контейнер");
		ОписаниеОповещенияОЗакрытииОткрываемойФормы = Новый ОписаниеОповещения("ОкончаниеРедактированияСтроки",
			ЭтаФорма, ПараметрыОповещения);
		ПараметрыОткрытия = Новый Структура("Объект, ТипЗначения, Заголовок, Значение, ТипКонтейнера", Объект,
			ТекущиеДанные.ТипЗначения, ТекущиеДанные.Имя, ТекущиеДанные.Контейнер, ТекущиеДанные.ТипКонтейнера);

		Если ТекущиеДанные.ТипКонтейнера = 3 Тогда
			ИмяФормыРедактирования = "РедактированиеТаблицы";
		Иначе
			ИмяФормыРедактирования = "ПодборВСписок";
		КонецЕсли;

		ОткрытьФорму(ПолноеИмяФормы(ИмяФормыРедактирования), ПараметрыОткрытия, ЭтаФорма, Ложь, , ,
			ОписаниеОповещенияОЗакрытииОткрываемойФормы, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

	ИначеЕсли ТипЗнч(ТекущиеДанные.Контейнер) = Тип("Структура") Тогда

		Если ТекущиеДанные.Контейнер.Тип = "МоментВремени" Или ТекущиеДанные.Контейнер.Тип = "Граница" Тогда
			СтандартнаяОбработка = Ложь;
			ПараметрыОповещения = Новый Структура("Таблица, Строка, Поле", "ПараметрыЗапроса",
				Элемент.Родитель.ТекущаяСтрока, "Контейнер");
			ОписаниеОповещенияОЗакрытииОткрываемойФормы = Новый ОписаниеОповещения("ОкончаниеРедактированияСтроки",
				ЭтаФорма, ПараметрыОповещения);
			ПараметрыОткрытия = Новый Структура("Объект, Значение", Объект, ТекущиеДанные.Контейнер);
			ОткрытьФорму(ПолноеИмяФормы("РедактированиеГраницыМомента"), ПараметрыОткрытия, ЭтаФорма, Ложь, , ,
				ОписаниеОповещенияОЗакрытииОткрываемойФормы, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
		ИначеЕсли ТекущиеДанные.Контейнер.Тип = "Тип" Тогда
			СтандартнаяОбработка = Ложь;
			ПараметрыОповещения = Новый Структура("Таблица, Строка, Поле", "ПараметрыЗапроса",
				Элемент.Родитель.ТекущаяСтрока, "КонтейнерКакТип");
			ОписаниеОповещенияОЗакрытииОткрываемойФормы = Новый ОписаниеОповещения("ОкончаниеРедактированияСтроки",
				ЭтаФорма, ПараметрыОповещения);
			ПараметрыОткрытия = Новый Структура("Объект, ТипЗначения, ТипКонтейнера", Объект, ТекущиеДанные.Контейнер,
				ТекущиеДанные.ТипКонтейнера);
			ОткрытьФорму(ПолноеИмяФормы("РедактированиеТипа"), ПараметрыОткрытия, ЭтаФорма, Истина, , ,
				ОписаниеОповещенияОЗакрытииОткрываемойФормы, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
		КонецЕсли;

	Иначе
		Если ТипЗнч(ТекущиеДанные.Значение) = Тип("УникальныйИдентификатор") Тогда
			СтандартнаяОбработка = Ложь;
			ПараметрыОповещения = Новый Структура("Таблица, Строка, Поле", "ПараметрыЗапроса",
				Элемент.Родитель.ТекущаяСтрока, "Значение");
			ОписаниеОповещенияОЗакрытииОткрываемойФормы = Новый ОписаниеОповещения("ОкончаниеРедактированияСтроки",
				ЭтаФорма, ПараметрыОповещения);
			ПараметрыОткрытия = Новый Структура("Объект, Значение", Объект, ТекущиеДанные.Значение);
			ОткрытьФорму(ПолноеИмяФормы("РедактированиеУникальногоИдентификатора"), ПараметрыОткрытия, ЭтаФорма,
				Истина, , , ОписаниеОповещенияОЗакрытииОткрываемойФормы,
				РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
		КонецЕсли;
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ПараметрыЗапросаПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
	Если НоваяСтрока И Не Копирование Тогда
		стрПараметра = Элементы.ПараметрыЗапроса.ТекущиеДанные;
		стрПараметра.Использовать = Истина;
	КонецЕсли
КонецПроцедуры


#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыВременныеТаблицы

&НаКлиенте
Процедура ВременныеТаблицыЗначениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

	СтандартнаяОбработка = Ложь;

	ТекущиеДанные = Элементы.ВременныеТаблицы.ТекущиеДанные;

	ПараметрыОповещения = Новый Структура("Таблица, Строка, Поле", "ВременныеТаблицы",
		Элементы.ВременныеТаблицы.ТекущаяСтрока, "Контейнер");
	ОписаниеОповещенияОЗакрытииОткрываемойФормы = Новый ОписаниеОповещения("ОкончаниеРедактированияСтроки", ЭтаФорма,
		ПараметрыОповещения);

	Если ТекущиеДанные.Контейнер = Неопределено Тогда
		ДанныеТЗ = Неопределено;
	Иначе
		ДанныеТЗ = ТекущиеДанные.Контейнер.Значение;
	КонецЕсли;

	ПараметрыРедактирования = УИ_ОбщегоНазначенияКлиент.НовыйПараметрыРедактированияТаблицыЗначений();
	ПараметрыРедактирования.СериализоватьВXML = Истина;
	УИ_ОбщегоНазначенияКлиент.РедактироватьТаблицуЗначений(ДанныеТЗ, ЭтотОбъект,
		ОписаниеОповещенияОЗакрытииОткрываемойФормы, ПараметрыРедактирования);

КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыСтруктураЗаписиРезультата

&НаКлиенте
Процедура СтруктураЗаписиРезультатаВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	ВставитьТекстПоПозицииКурсораАлгоритма(СтруктураЗаписиРезультатаПолучитьТекстВставки(ВыбраннаяСтрока));
КонецПроцедуры

&НаКлиенте
Процедура СтруктураЗаписиРезультатаПередРазворачиванием(Элемент, Строка, Отказ)

	СтрокаДерева = СтруктураЗаписиРезультата.НайтиПоИдентификатору(Строка);

	Если Не СтрокаДерева.ПодчиненныеУзлыРаскрыты Тогда
		//СтруктураЗаписиРезультата_РаскрытьПодчиненныеУзлы(Строка);
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура СтруктураЗаписиРезультатаНачалоПеретаскивания(Элемент, ПараметрыПеретаскивания, Выполнение)

	маЧасти = Новый Массив;
	Для Каждого Значение Из ПараметрыПеретаскивания.Значение Цикл
		маЧасти.Добавить(СтруктураЗаписиРезультатаПолучитьТекстВставки(Значение));
	КонецЦикла;

	ПараметрыПеретаскивания.Значение = СтрСоединить(маЧасти, ";");

КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыПакетРезультатаЗапроса

&НаКлиенте
Процедура ПакетРезультатаЗапросаВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)

	Если Элемент.ТекущийЭлемент.Имя = "ПакетРезультатаЗапросаИнфо" Тогда

		ОтключитьОбработчикОжидания("ПакетРезультатаЗапросаОбработчикОжиданияПриАктивизацииСтроки");
		ТекущаяСтрока = Элементы.ПакетРезультатаЗапроса.ТекущаяСтрока;
		Если ТекущаяСтрока <> Неопределено Тогда
			Если ИзвлечьРезультат(ПакетРезультатаЗапроса.Индекс(ПакетРезультатаЗапроса.НайтиПоИдентификатору(
				ТекущаяСтрока)) + 1) > 0 Тогда
				СтруктураЗаписиРезультата_Развернуть();
			КонецЕсли;
		КонецЕсли;

		Команда_ПланЗапроса(Неопределено);

	ИначеЕсли Элемент.ТекущийЭлемент.Имя = "ПакетРезультатаЗапросаИмя" Тогда

		ОтключитьОбработчикОжидания("ПакетРезультатаЗапросаОбработчикОжиданияПриАктивизацииСтроки");
		ТекущаяСтрока = Элементы.ПакетРезультатаЗапроса.ТекущаяСтрока;
		Если ТекущаяСтрока <> Неопределено Тогда
			Если ИзвлечьРезультат(ПакетРезультатаЗапроса.Индекс(ПакетРезультатаЗапроса.НайтиПоИдентификатору(
				ТекущаяСтрока)) + 1) > 0 Тогда
				СтруктураЗаписиРезультата_Развернуть();
			КонецЕсли;
		КонецЕсли;

	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ПакетРезультатаЗапросаПриАктивизацииСтроки(Элемент)
	ПодключитьОбработчикОжидания("ПакетРезультатаЗапросаОбработчикОжиданияПриАктивизацииСтроки", 0.01, Истина);
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыРезультатЗапросаДерево

&НаКлиенте
Процедура РезультатЗапросаВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)

	ИмяКолонки = РезультатЗапросаСоответствиеКолонок[Поле.Имя];

	Значение = Элемент.ТекущиеДанные[ИмяКолонки];

	Если РезультатЗапросаКолонкиКонтейнера.Свойство(ИмяКолонки) Тогда

		Контейнер = ЭтаФорма[Элемент.Имя].НайтиПоИдентификатору(Элемент.ТекущаяСтрока)[ИмяКолонки
			+ СуффиксРеквизитаКонтейнера];

		Если Контейнер.Тип = "ТаблицаЗначений" Тогда
			ПараметрыОткрытия = Новый Структура("Объект, Заголовок, Значение, ТолькоПросмотр", Объект, ИмяКолонки,
				Контейнер, Истина);
			ОткрытьФорму(ПолноеИмяФормы("РедактированиеТаблицы"), ПараметрыОткрытия, ЭтаФорма, Ложь, , , ,
				РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
		ИначеЕсли Контейнер.Тип = Неопределено Тогда
			//Это пустой контейнер, значит, значение лежит в основном поле.
			ПоказатьЗначение( , Значение);
		Иначе
			ПоказатьЗначение( , Контейнер.Представление);
		КонецЕсли;

	Иначе
		ПоказатьЗначение( , Значение);
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура УИ_РезультатЗапросаПриАктивизацииСтроки(Элемент)	
	УИ_ЗаполнитьСвойстваСтроки(Элемент.Имя);
КонецПроцедуры

&НаКлиенте
Процедура УИ_РезультатЗапросаПриАктивизацииЯчейки(Элемент)
	УИ_АктивизироватьСтрокуСвойстваСтроки(Элемент.Имя);
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыУИ_СвойстваСтроки

&НаКлиенте
Процедура УИ_СвойстваСтрокиВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	
	ИмяИсточника = УИ_ИмяИсточникаПоРеквизитуВидРезультата();
	ИмяКолонки = Элемент.ТекущиеДанные.Свойство;
	ИмяПоля = Неопределено;
	Для Каждого КлючИЗначение Из РезультатЗапросаСоответствиеКолонок Цикл
		Если КлючИЗначение.Значение = ИмяКолонки Тогда
			ИмяПоля = КлючИЗначение.Ключ;
			Прервать;
		КонецЕсли;
	КонецЦикла;
	
	Если ЗначениеЗаполнено(ИмяПоля) Тогда
		Структура = Новый Структура("Имя", ИмяПоля);
		РезультатЗапросаВыбор(Элементы[ИмяИсточника], Неопределено, Структура, Истина);
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура Команда_УбратьКомментированиеСтрокИзТекста(Команда)
	Если Элементы.ГруппаЗапросСтраницы.ТекущаяСтраница = Элементы.СтраницаЗапрос Тогда
		УбратьКомментированиеСтрокИзТекста(Элементы.ТекстЗапроса);
	ИначеЕсли Элементы.ГруппаЗапросСтраницы.ТекущаяСтраница = Элементы.СтраницаАлгоритм Тогда
		УбратьКомментированиеСтрокИзТекста(Элементы.ТекстАлгоритм);
	ИначеЕсли Элементы.ГруппаЗапросСтраницы.ТекущаяСтраница = Элементы.СтраницаАлгоритмПередВыполнением Тогда
		УбратьКомментированиеСтрокИзТекста(Элементы.ТекстАлгоритмПередВыполнением);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура Команда_СинтаксическийКонтрольЗапроса(Команда)

	Если Элементы.ГруппаЗапросСтраницы.ТекущаяСтраница <> Элементы.СтраницаЗапрос Тогда
		Возврат;
	КонецЕсли;

	Результат = ФорматироватьТекстЗапросаНаСервере(ТекущийТекстЗапроса());

	Если ТипЗнч(Результат) <> Тип("Строка") Тогда
		ПоказатьПредупреждениеКонсоли(Результат.ОписаниеОшибки);
		ТекущийЭлемент = Элементы.ТекстЗапроса;
		Если ЗначениеЗаполнено(Результат.Строка) Тогда
			УстановитьГраницыВыделенияЗапроса(Результат.Строка, Результат.Колонка, Результат.Строка,
				Результат.Колонка);
		КонецЕсли;
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура Команда_ФорматироватьТекстЗапроса(Команда)

	Если Элементы.ГруппаЗапросСтраницы.ТекущаяСтраница <> Элементы.СтраницаЗапрос Тогда
		Возврат;
	КонецЕсли;

	стрТекстЗапроса = ТекущийТекстЗапроса();
	КомментарииЗапроса_СохранитьДанныеИсходногоЗапроса(стрТекстЗапроса);
	Результат = ФорматироватьТекстЗапросаНаСервере(стрТекстЗапроса);

	Если ТипЗнч(Результат) <> Тип("Строка") Тогда

		ПоказатьПредупреждениеКонсоли(Результат.ОписаниеОшибки);
		ТекущийЭлемент = Элементы.ТекстЗапроса;
		Если ЗначениеЗаполнено(Результат.Строка) Тогда
			УстановитьГраницыВыделенияЗапроса(Результат.Строка, Результат.Колонка, Результат.Строка,
				Результат.Колонка);
		КонецЕсли;

		Возврат;

	КонецЕсли;

	КомментарииЗапроса_Восстановить(Результат);

	УстановитьТекстЗапроса(Результат);
	ПоместитьРедактируемыйЗапрос();
	Модифицированность = Истина;

КонецПроцедуры

&НаКлиенте
Процедура Команда_ПолучитьКодДляПерехватаВОтладчике(Команда)

	Если Объект.РежимЗапускаВнешняяОбработка Тогда

		стрИмяФайлаОбработкиНаСервере = ПолучитьИмяФайлаОбработкиНаСервере();
		//"ВнешниеОбработки.Создать(""" + стрИмяФайлаОбработкиНаСервере + """, Ложь).СохранитьЗапрос(" + Формат(Объект.СеансИД, "ЧГ=0") + ", Запрос)";
		стрКод = СтрШаблон("ВнешниеОбработки.Создать(""%1"", Ложь).СохранитьЗапрос(%2, Запрос)",
			стрИмяФайлаОбработкиНаСервере, Формат(Объект.СеансИД, "ЧГ=0"));
	Иначе

		стрКод = СтрШаблон("Обработки.%1.Создать().СохранитьЗапрос(%2, Запрос)", Объект.ИмяОбработки, Формат(
			Объект.СеансИД, "ЧГ=0"));

	КонецЕсли;

	ПараметрыОткрытия = Новый Структура("
										|Объект,
										|Заголовок,
										|КодДляКопирования,
										|Информация", Объект, "Код для перехвата запроса в отладчике", стрКод, "Для перехвата запроса в отладчике скопируйте и выполните по Shift+F9 указанный код.
																											   |Консоль запросов должна быть запущена в той же информационной базе под тем же пользователем.
																											   |Для получения запросов в консоль используйте команду на закладке текста запроса ""Перехват | Получить перехваченные запросы (Ctrl+F9)""
																											   |В настройках пользователя должна быть отключена защита от опасных действий.");

	ОткрытьФорму(ПолноеИмяФормы("Информация"), ПараметрыОткрытия, ЭтаФорма, Ложь, , , ,
		РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

КонецПроцедуры

&НаКлиенте
Процедура Команда_ДобавитьПерехваченныеЗапросы(Команда)

	стрПояснение = "Загрузка перехваченных запросов";

	ПоместитьРедактируемыйЗапрос();

	маФайлыЗапросов = ПолучитьСписокФайловНаСервереВоВременных("*." + Объект.РасширениеЗахваченныхЗапросов);

	й = 1;
	Для Каждого стрФайл Из маФайлыЗапросов Цикл
		Состояние("Загрузка перехваченного запроса: " + й + " из " + маФайлыЗапросов.Количество(), (й - 1) * 100
			/ маФайлыЗапросов.Количество(), стрПояснение);
		НовыйЗапрос = ПакетЗапросов.ПолучитьЭлементы().Добавить();
		Элементы.ПакетЗапросов.ТекущаяСтрока = НовыйЗапрос.ПолучитьИдентификатор();
		ЗаполнитьИзФайла(стрФайл);
		ПоместитьРедактируемыйЗапрос();
		й = й + 1;
	КонецЦикла;

	Состояние("Удаление временных файлов...", 100, стрПояснение);
	УдалитьФайлыНаСервере(маФайлыЗапросов);
	ПоказатьПредупреждениеКонсоли("Загруженно перехваченных запросов: " + маФайлыЗапросов.Количество());
	Модифицированность = Модифицированность Или маФайлыЗапросов.Количество() > 0;

КонецПроцедуры

&НаКлиенте
Процедура Команда_УдалитьПерехваченныеЗапросы(Команда)

	ПоместитьРедактируемыйЗапрос();

	маФайлыЗапросов = ПолучитьСписокФайловНаСервереВоВременных("*." + Объект.РасширениеЗахваченныхЗапросов);

	Состояние("Удаление временных файлов...", 100);
	УдалитьФайлыНаСервере(маФайлыЗапросов);
	ПоказатьПредупреждениеКонсоли("Удалено перехваченных запросов: " + маФайлыЗапросов.Количество());

КонецПроцедуры

&НаКлиенте
Процедура Команда_КонструкторЗапроса(Команда)

	стрТекстЗапроса = ТекущийТекстЗапроса();
	КомментарииЗапроса_СохранитьДанныеИсходногоЗапроса(стрТекстЗапроса);

	Если ЗначениеЗаполнено(стрТекстЗапроса) Тогда
		КонструкторЗапроса = ПолучитьКонструкторЗапроса(стрТекстЗапроса);
		Если КонструкторЗапроса = Неопределено Тогда
			Возврат;
		КонецЕсли;
	Иначе
		КонструкторЗапроса = Новый КонструкторЗапроса;
	КонецЕсли;

#Если ТолстыйКлиентУправляемоеПриложение Тогда
	Если КонструкторЗапроса.ОткрытьМодально() Тогда
		стрТекстЗапроса = КонструкторЗапроса.Текст;
		КомментарииЗапроса_Восстановить(стрТекстЗапроса);
		УстановитьТекстЗапроса(стрТекстЗапроса);
		ПоместитьРедактируемыйЗапрос();
		Модифицированность = Истина;
	КонецЕсли;
#Иначе

		Если ЗапросВКонструкторе > 0 Тогда
			Запрос_УстановитьВКонструкторе(ЗапросВКонструкторе, Ложь);
			ЗапросВКонструкторе = -1;
		КонецЕсли;

		ТекущийЗапрос = ПакетЗапросов_ТекущийЗапрос();
		Запрос_УстановитьВКонструкторе(ТекущийЗапрос, Истина);
		ИзвлечьРедактируемыйЗапрос();
		КонструкторЗапроса.Показать(
			Новый ОписаниеОповещения("Команда_КонструкторЗапроса_ОповещениеЗакрытияКонструктора", ЭтаФорма,
			ТекущийЗапрос));

#КонецЕсли

КонецПроцедуры


&НаКлиенте
Процедура УИ_РедактироватьЗначение(Команда)
	ЭлементФормы=Элементы.РезультатЗапроса;
	Если ВидРезультата = "дерево" Тогда
		ЭлементФормы=Элементы.РезультатЗапросаДерево;
	КонецЕсли;
		
	ТекДанные=ЭлементФормы.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	ТекКолонка=ЭлементФормы.ТекущийЭлемент;

	ИмяКолонки=СтрЗаменить(ТекКолонка.Имя, ЭлементФормы.Имя, "");
	
	ЗначениеКолонки=ТекДанные[ИмяКолонки];

	Попытка
		МодульОбщегоНазначениеКлиент=Вычислить("УИ_ОбщегоНазначенияКлиент");
	Исключение
		МодульОбщегоНазначениеКлиент=Неопределено;
	КонецПопытки;

	Если МодульОбщегоНазначениеКлиент = Неопределено Тогда
		Возврат;
	КонецЕсли;

	Если ЗначениеКолонки = "<ХранилищеЗначения>" Тогда
		МодульОбщегоНазначениеКлиент.РедактироватьХранилищеЗначения(ЭтотОбъект, ТекДанные[ИмяКолонки
			+ СуффиксРеквизитаКонтейнера].Хранилище);
	Иначе
		МодульОбщегоНазначениеКлиент.РедактироватьОбъект(ЗначениеКолонки);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура УИ_РедактироватьЗначениеСтрокиСвойтсв(Команда)
	ТекДанные=Элементы.УИ_СвойстваСтроки.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если ТекДанные.Значение = "<ХранилищеЗначения>" Тогда
		ЭлементФормыРезультат=Элементы.РезультатЗапроса;
		Если ВидРезультата = "дерево" Тогда
			ЭлементФормыРезультат=Элементы.РезультатЗапросаДерево;
		КонецЕсли;
		ТекДанныеРезультата=ЭлементФормыРезультат.ТекущиеДанные;
		Если ТекДанныеРезультата = Неопределено Тогда
			Возврат;
		КонецЕсли;
		
		УИ_ОбщегоНазначенияКлиент.РедактироватьХранилищеЗначения(ЭтотОбъект, ТекДанныеРезультата[ТекДанные.Свойство
			+ СуффиксРеквизитаКонтейнера].Хранилище);
			
	Иначе
		УИ_ОбщегоНазначенияКлиент.РедактироватьОбъект(ТекДанные.Значение);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура Команда_ВыполнитьЗапрос(Команда)
	Если Элементы.ПакетЗапросов.ТекущаяСтрока <> Неопределено Тогда
		ВыполнитьЗапрос(Истина);
	КонецЕсли;
КонецПроцедуры

#Область ПакетЗапросов

&НаКлиенте
Процедура Команда_ПакетЗапросовДобавить(Команда)
	Элементы.ПакетЗапросов.ТекущаяСтрока = ПакетЗапросов.ПолучитьЭлементы().Добавить().ПолучитьИдентификатор();
	Элементы.ПакетЗапросов.ТекущийЭлемент = Элементы.СписокЗапросовЗапрос;
	Элементы.ПакетЗапросов.ИзменитьСтроку();
	Модифицированность = Истина;
КонецПроцедуры

&НаКлиенте
Процедура Команда_ПакетЗапросовСкопировать(Команда)

	Строка = ПакетЗапросов.НайтиПоИдентификатору(Элементы.ПакетЗапросов.ТекущаяСтрока);
	НоваяСтрока = Строка.ПолучитьЭлементы().Добавить();
	ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка, ,
		"ВКонструкторе, Инфо, КоличествоВозвращенныхСтрокРезультата, КоличествоСтрокРезультата, РазницаМеждуКоличествомВозвращенныхСтрокИКоличествомСтрокРезультата");
	НоваяСтрока.Имя = "Копия " + НоваяСтрока.Имя;
	Элементы.ПакетЗапросов.ТекущаяСтрока = НоваяСтрока.ПолучитьИдентификатор();
	Элементы.ПакетЗапросов.ТекущийЭлемент = Элементы.СписокЗапросовЗапрос;
	Элементы.ПакетЗапросов.ИзменитьСтроку();

	Модифицированность = Истина;

КонецПроцедуры

&НаКлиенте
Процедура Команда_ПакетЗапросовПереместитьНаУровеньВверх(Команда)

	Строка = ПакетЗапросов.НайтиПоИдентификатору(Элементы.ПакетЗапросов.ТекущаяСтрока);
	Родитель = Строка.ПолучитьРодителя();

	Если Родитель <> Неопределено Тогда
		РодительРодителя = Родитель.ПолучитьРодителя();
		Если РодительРодителя = Неопределено Тогда
			ИндексВставки = ПакетЗапросов.ПолучитьЭлементы().Индекс(Родитель) + 1;
		Иначе
			ИндексВставки = РодительРодителя.ПолучитьЭлементы().Индекс(Родитель) + 1;
		КонецЕсли;
		НоваяСтрока = ПереместитьСтрокуДерева(ПакетЗапросов, Строка, ИндексВставки, РодительРодителя);
		Элементы.ПакетЗапросов.ТекущаяСтрока = НоваяСтрока.ПолучитьИдентификатор();
	КонецЕсли;

	Модифицированность = Истина;

КонецПроцедуры

&НаКлиенте
Процедура Команда_НовыйПакетЗапросов(Команда)

	Если Не СохранитьСВопросом("Новый") Тогда
		Возврат;
	КонецЕсли;

	ПакетЗапросов_Новый();

КонецПроцедуры

&НаКлиенте
Процедура Команда_ЗагрузитьПакетЗапросов(Команда)

	Если Не СохранитьСВопросом("Загрузка") Тогда
		Возврат;
	КонецЕсли;

	ЗагрузитьПакетЗапросов();

КонецПроцедуры

&НаКлиенте
Процедура Команда_ДобавитьПакетЗапросов(Команда)
	
	ДополнительныеПараметры = Новый Структура("Добавление", Истина);
	
	ЗагрузитьПакетЗапросов(ДополнительныеПараметры);
	
КонецПроцедуры


&НаКлиенте
Процедура Команда_СохранитьПакетЗапросов(Команда)
	СохранитьПакетЗапросов(Новый Структура);
КонецПроцедуры

&НаКлиенте
Процедура Команда_ПакетЗапросовСохранитьКак(Команда)
	ПакетЗапросовСохранитьКак(Новый Структура);
КонецПроцедуры



#КонецОбласти

&НаКлиенте
Процедура Команда_ПараметрыЗаполнитьИзЗапроса(Команда)
	стОшибка = ПараметрыЗаполнитьИзЗапросаНаСервере(ТекущийТекстЗапроса());

	Если ЗначениеЗаполнено(стОшибка) Тогда

		ПоказатьПредупреждениеКонсоли(стОшибка.ОписаниеОшибки);
		ТекущийЭлемент = Элементы.ТекстЗапроса;

		Если ЗначениеЗаполнено(стОшибка.Строка) Тогда
			УстановитьГраницыВыделенияЗапроса(стОшибка.Строка, стОшибка.Колонка, стОшибка.Строка,
				стОшибка.Колонка);
		КонецЕсли;

	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура Команда_ЗаполнитьИзXML(Команда)
	стрОшибка = ЗаполнитьИзXMLНаСервере(ТекущийТекстЗапроса());
	Если ЗначениеЗаполнено(стрОшибка) Тогда
		ПоказатьПредупреждениеКонсоли(стрОшибка);
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура Команда_ПараметрыОчистить(Команда)
	ПараметрыЗапроса.Очистить();
КонецПроцедуры


&НаКлиенте
Процедура Команда_ПараметрыЗапросаРядомСТекстом(Команда)
	//https://github.com/cpr1c/tools_ui_1c/issues/481
	УИ_РедакторКодаКлиент.ПереключитьВидимостьРедактора(ЭтотОбъект, "Алгоритм");
	УИ_РедакторКодаКлиент.ПереключитьВидимостьРедактора(ЭтотОбъект, "АлгоритмПередВыполнением");
	
	Элементы.ПараметрыЗапросаРядомСТекстом.Пометка = Не Элементы.ПараметрыЗапросаРядомСТекстом.Пометка;
	СохраняемыеСостояния_Сохранить("ПараметрыЗапросаРядомСТекстом", Элементы.ПараметрыЗапросаРядомСТекстом.Пометка);
	ПараметрыЗапросаРядомСТекстомНаСервере();
	
	ПодключитьОбработчикОжидания("Команда_ПараметрыЗапросаРядомСТекстом_ВключениеВидимостиРедакторов", 0.1, Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура Команда_ТехнологическийЖурнал(Команда)
	Если Элементы.ТехнологическийЖурнал.Пометка Тогда
		ТехнологическийЖурнал_Выключить();
		Элементы.ТехнологическийЖурнал.Пометка = Ложь;
		Элементы.ПланЗапроса.Видимость = Ложь;
		Элементы.ПакетРезультатаЗапросаИнфо.ГиперссылкаЯчейки = Ложь;
		ТехнологическийЖурналВремяВключенияВыключения = ТекущаяУниверсальнаяДатаВМиллисекундах();
		ПодключитьОбработчикОжидания("ТехнологическийЖурнал_ОжиданиеВыключения",
			ОпцияПериодОпросаВключенияВыключенияТехнологическогоЖурнала, Истина);
	Иначе
		ТехнологическийЖурнал_Включить();
		ТехнологическийЖурналВключенИРаботает = Ложь;
		Элементы.ТехнологическийЖурнал.Пометка = Истина;
		ТехнологическийЖурнал_ИндикацияВключения(Ложь);
		ТехнологическийЖурналВремяВключенияВыключения = ТекущаяУниверсальнаяДатаВМиллисекундах();
		ПодключитьОбработчикОжидания("ТехнологическийЖурнал_ОжиданиеВключения",
			ОпцияПериодОпросаВключенияВыключенияТехнологическогоЖурнала, Истина);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура Команда_ПланЗапроса(Команда)

	ТекущаяСтрока = Элементы.ПакетРезультатаЗапроса.ТекущаяСтрока;
	Если ТекущаяСтрока = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ПараметрыОткрытия = Новый Структура("Объект, АдресРезультатаЗапроса, РезультатВПакете", Объект,
		АдресРезультатаЗапроса, ПакетРезультатаЗапроса.Индекс(ПакетРезультатаЗапроса.НайтиПоИдентификатору(
		ТекущаяСтрока)) + 1);
	Форма = ОткрытьФорму(ПолноеИмяФормы("ФормаПланаЗапроса"), ПараметрыОткрытия, ЭтаФорма, Ложь, , , ,
		РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

	Если Форма = Неопределено Тогда
		ПоказатьПредупреждениеКонсоли("Не удалось получить информацию о запросе");
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура Команда_ДобавитьПереносСтрокВТекст(Команда)
	Если Элементы.ГруппаЗапросСтраницы.ТекущаяСтраница = Элементы.СтраницаЗапрос Тогда
		ДобавитьПереносСтрокВТекст(Элементы.ТекстЗапроса);
	ИначеЕсли Элементы.ГруппаЗапросСтраницы.ТекущаяСтраница = Элементы.СтраницаАлгоритм Тогда
		ДобавитьПереносСтрокВТекст(Элементы.ТекстАлгоритм);
	ИначеЕсли Элементы.ГруппаЗапросСтраницы.ТекущаяСтраница = Элементы.СтраницаАлгоритмПередВыполнением Тогда
		ДобавитьПереносСтрокВТекст(Элементы.ТекстАлгоритмПередВыполнением);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура Команда_УбратьПереносСтрокИзТекста(Команда)
	Если Элементы.ГруппаЗапросСтраницы.ТекущаяСтраница = Элементы.СтраницаЗапрос Тогда
		УбратьПереносСтрокИзТекста(Элементы.ТекстЗапроса);
	ИначеЕсли Элементы.ГруппаЗапросСтраницы.ТекущаяСтраница = Элементы.СтраницаАлгоритм Тогда
		УбратьПереносСтрокИзТекста(Элементы.ТекстАлгоритм);
	ИначеЕсли Элементы.ГруппаЗапросСтраницы.ТекущаяСтраница = Элементы.СтраницаАлгоритмПередВыполнением Тогда
		УбратьПереносСтрокИзТекста(Элементы.ТекстАлгоритмПередВыполнением);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура Команда_ДобавитьКомментированиеСтрокВТекст(Команда)
	Если Элементы.ГруппаЗапросСтраницы.ТекущаяСтраница = Элементы.СтраницаЗапрос Тогда
		ДобавитьКомментированиеСтрокВТекст(Элементы.ТекстЗапроса);
	ИначеЕсли Элементы.ГруппаЗапросСтраницы.ТекущаяСтраница = Элементы.СтраницаАлгоритм Тогда
		ДобавитьКомментированиеСтрокВТекст(Элементы.ТекстАлгоритм);
	ИначеЕсли Элементы.ГруппаЗапросСтраницы.ТекущаяСтраница = Элементы.СтраницаАлгоритмПередВыполнением Тогда
		ДобавитьКомментированиеСтрокВТекст(Элементы.ТекстАлгоритмПередВыполнением);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура Команда_ОбновитьРезультат(Команда)
	Если ИзвлечьРезультат() > 0 Тогда
		СтруктураЗаписиРезультата_Развернуть();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура Команда_РезультатЗапросаДеревоРазвернутьВсе(Команда)
	Для Каждого ЭлементДерева Из РезультатЗапросаДерево.ПолучитьЭлементы() Цикл
		Элементы.РезультатЗапросаДерево.Развернуть(ЭлементДерева.ПолучитьИдентификатор(), Истина);
	КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура Команда_РезультатЗапросаДеревоСвернутьВсе(Команда)
	Для Каждого ЭлементДерева Из РезультатЗапросаДерево.ПолучитьЭлементы() Цикл
		Элементы.РезультатЗапросаДерево.Свернуть(ЭлементДерева.ПолучитьИдентификатор());
	КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура Команда_РезультатВТабличныйДокумент(Команда)
	
	фОтображатьИтоги = Элементы.ОтобразитьСкрытьПанельРезультатаИтоги.Пометка;
	
	ПараметрыОткрытия = Новый Структура("Объект, АдресРезультатаЗапроса, РезультатВПакете, ИмяЗапроса, ВидРезультата, фОтображатьИтоги",
		Объект, АдресРезультатаЗапроса, РезультатВПакете, ИмяЗапросаРезультата, ВидРезультата, фОтображатьИтоги);
		
	ФормаТабличногоДокумента = ОткрытьФорму(ПолноеИмяФормы("ФормаТабличногоДокумента"), ПараметрыОткрытия, ЭтаФорма,
		Ложь);

	Если Не ФормаТабличногоДокумента.Инициализированна Тогда
		//Обновление уже открытой формы
		Оповестить("Обновить", ПараметрыОткрытия);
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура Команда_ОтобразитьСкрытьПанельРезультатаИтоги(Команда)
	фОтображатьИтоги = Не Элементы.ОтобразитьСкрытьПанельРезультатаИтоги.Пометка;
	Элементы.ОтобразитьСкрытьПанельРезультатаИтоги.Пометка = фОтображатьИтоги;
	Элементы.РезультатЗапроса.Подвал = фОтображатьИтоги;
КонецПроцедуры

&НаКлиенте
Процедура Команда_РезультатЗапросаТаблицаСортироватьУбыв(Команда)
	СортироватьРезультатЗапросаТаблица("Убыв");
КонецПроцедуры

&НаКлиенте
Процедура Команда_РезультатЗапросаТаблицаСортироватьВозр(Команда)
	 СортироватьРезультатЗапросаТаблица("Возр");
КонецПроцедуры

&НаКлиенте
Процедура Команда_РезультатЗапросаДеревоСортироватьВозр(Команда)
	СортироватьРезультатЗапросаДерево("Возр");
КонецПроцедуры

&НаКлиенте
Процедура Команда_РезультатЗапросаДеревоСортироватьУбыв(Команда)
	СортироватьРезультатЗапросаДерево("Убыв");
КонецПроцедуры

&НаКлиенте
Процедура Команда_ВыполнитьОбработку(Команда)

	Если Не ЗначениеЗаполнено(РезультатВПакете) Или Число(РезультатВПакете) <= 0 Тогда
		ПоказатьПредупреждениеКонсоли("Выполнение невозможно - результат запроса отсутствует");
		Возврат;
	КонецЕсли;

	Если Не ПустаяСтрока(ФоновоеЗаданиеИдентификатор) Тогда
		//прерывание выполнения
		ПрерватьФоновоеЗадание();
		ОтобразитьСостояниеФоновогоЗадания();
		ПоказатьПредупреждениеКонсоли("Выполнение прервано пользователем!");
		Возврат;
	КонецЕсли;
	
	ИменаПеременных = Новый Массив;
	ИменаПеременных.Добавить("Выборка");
	ИменаПеременных.Добавить("Параметры");
	СтруктураИменПеременных = Новый Структура("Алгоритм", ИменаПеременных);

	УИ_РедакторКодаКлиент.НачатьСборкуОбработокДляИсполненияКода(ЭтотОбъект,
																 Новый ОписаниеОповещения("Команда_ВыполнитьОбработкуЗавершениеПодключенияОбработокИсполнения",
		ЭтотОбъект),
																 СтруктураИменПеременных);

КонецПроцедуры

&НаКлиенте
Процедура Команда_ВставитьПредопределенноеЗначение(Команда)

	ГраницыВыделения = ГраницыВыделенияЗапроса();
	ПараметрыОповещения = Новый Структура("НачальнаяСтрока, НачальнаяКолонка, КонечнаяСтрока, КонечнаяКолонка",
		ГраницыВыделения.НачалоСтроки, ГраницыВыделения.НачалоКолонки, ГраницыВыделения.КонецСтроки,
		ГраницыВыделения.КонецКолонки);
	ОписаниеОповещенияОЗакрытииОткрываемойФормы = Новый ОписаниеОповещения("ОкончаниеВыбораПредопределенного",
		ЭтаФорма, ПараметрыОповещения);
	ПараметрыОткрытия = Новый Структура("Объект, ДанныеФормы, ТекстЗапроса, НачальнаяСтрока, НачальнаяКолонка, КонечнаяСтрока, КонечнаяКолонка",
		Объект, ДанныеФормыВыборПредопределенного, ТекущийТекстЗапроса(), ГраницыВыделения.НачалоСтроки,
		ГраницыВыделения.НачалоКолонки, ГраницыВыделения.КонецСтроки, ГраницыВыделения.КонецКолонки);

	ОткрытьФорму(ПолноеИмяФормы("ВыборПредопределенного"), ПараметрыОткрытия, ЭтаФорма, Истина, , ,
		ОписаниеОповещенияОЗакрытииОткрываемойФормы, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

КонецПроцедуры

//&НаСервере
//Процедура ПолучитьТаблицуЗнвченийРезультата(Команда)
//КонецПроцедуры

&НаКлиенте
Процедура Команда_РезультатВПараметр(Команда)

	тзТаблица = ИзвлечьРезультатКакКонтейнер();

	ПараметрыОповещения = Новый Структура("Таблица, Строка, Поле", "ПараметрыЗапроса", Неопределено, "ТипЗначения");
	ОписаниеОповещенияОЗакрытииОткрываемойФормы = Новый ОписаниеОповещения("ОкончаниеРедактированияСтроки", ЭтаФорма,
		ПараметрыОповещения);
	ПараметрыОткрытия = Новый Структура("Объект, ТипЗначения, ТипКонтейнера, Имя, ВЗапросРазрешено, ВПараметр", Объект,
		тзТаблица, 3, ИмяЗапросаРезультата, Ложь, Истина);
	ОткрытьФорму(ПолноеИмяФормы("РедактированиеТипа"), ПараметрыОткрытия, ЭтаФорма, Истина, , ,
		ОписаниеОповещенияОЗакрытииОткрываемойФормы, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

КонецПроцедуры

&НаКлиенте
Процедура Команда_СправкаАлгоритм(Команда)
	ПараметрыОткрытия = Новый Структура("ИмяМакета, Заголовок", "СправкаАлгоритм", "Обработка результата запроса кодом");
	ОткрытьФорму(ПолноеИмяФормы("Справка"), ПараметрыОткрытия, ЭтаФорма);
КонецПроцедуры

&НаКлиенте
Процедура Команда_ПолучитьКодСПараметрами(Команда)

	Если Элементы.ПакетЗапросов.ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	//В качестве имени запроса попробуем использовать его название. Если не получится - тогда просто "Запрос".
	ИмяЗапроса = Элементы.ПакетЗапросов.ТекущиеДанные.Имя;
	Если Не ИмяКорректно(ИмяЗапроса) Тогда
		ИмяЗапроса = "Запрос";
	КонецЕсли;

	ПараметрыОткрытия = Новый Структура("
										|Объект,
										|ИмяЗапроса,
										|ТекстЗапроса,
										|ПараметрыЗапроса,
										|ТекстАлгоритма,
										|МетодИсполненияКода,
										|Заголовок,
										|Содержание", Объект, ИмяЗапроса, ТекущийТекстЗапроса(),
		ПараметрыЗапроса_ПолучитьКакСтроку(), ТекущийТекстАлгоритма(), МетодИсполненияКода,
		"Код для выполнения запроса на встроенном языке 1С");

	ОткрытьФорму(ПолноеИмяФормы("ФормаКода"), ПараметрыОткрытия, ЭтаФорма, Ложь, , , ,
		РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

КонецПроцедуры

&НаКлиенте
Процедура Команда_ОтобразитьСкрытьПакетРезультатаЗапроса(Команда)
	фВидимостьПакетаРезультатаЗапроса = Не Элементы.ОтобразитьСкрытьПакетРезультатаЗапроса.Пометка;
	Элементы.ОтобразитьСкрытьПакетРезультатаЗапроса.Пометка = фВидимостьПакетаРезультатаЗапроса;
	Элементы.ПакетРезультатаЗапроса.Видимость = фВидимостьПакетаРезультатаЗапроса;
	Элементы.ГруппаРезультатВПакете.Видимость = Не фВидимостьПакетаРезультатаЗапроса;
	Объект.СохраняемыеСостояния.Вставить("ВидимостьПакетаРезультатаЗапроса", фВидимостьПакетаРезультатаЗапроса);
КонецПроцедуры

&НаКлиенте
Процедура ВставитьМакроКолонку(Команда)
	УИ_РедакторКодаКлиент.ВставитьМакроКолонкуРедактораЗапроса(ЭтотОбъект, "Запрос");

КонецПроцедуры


&НаКлиенте
Процедура УИ_ПреобразоватьТекстЗапросаИзВыраженияВстроенногоЯзыка(Команда)
	УИ_РедакторКодаКлиент.ПреобразоватьТекстЗапросаИзВыраженияВстроенногоЯзыкаРедактораКода(ЭтотОбъект, "Запрос");
КонецПроцедуры



&НаКлиенте
Процедура Подключаемый_ВыполнитьКомандуРедактораКода(Команда)
	УИ_РедакторКодаКлиент.ВыполнитьКомандуРедактораКода(ЭтотОбъект, Команда);
КонецПроцедуры

&НаКлиенте
Процедура ОтобразитьСкрытьРезультатЗапроса(Команда)
	Элементы.ОтобразитьСкрытьРезультатЗапроса.Пометка = Не Элементы.ОтобразитьСкрытьРезультатЗапроса.Пометка;
	Элементы.ГруппаНижняяПанель.Видимость = Элементы.ОтобразитьСкрытьРезультатЗапроса.Пометка;
КонецПроцедуры

#Область УИ

// Открывает конструктор представлений с учетом выделенного текста в редакторе запросов.
//
// Параметры:
//   Команда - КомандаФормы - Команда, инициировавшая открытие конструктора
&НаКлиенте
Процедура УИ_ОткрытьКонструкторПредставлений(Команда)
	
	ГраницыВыделения = УИ_РедакторКодаКлиент.ГраницыВыделенияРедактораЭлементаФормы(ЭтотОбъект, Элементы.ТекстЗапроса);
	ВыделенныйТекст = УИ_РедакторКодаКлиент.ВыделенныйТекстРедактораЭлементаФормы(ЭтотОбъект, Элементы.ТекстЗапроса);
	
	ДополнительныеПараметры = Новый Структура;
	ДополнительныеПараметры.Вставить("ГраницыВыделения", ГраницыВыделения);
	ДополнительныеПараметры.Вставить("ВыделенныйТекст", ВыделенныйТекст);
	
	ПараметрыОткрытия = Новый Структура;
	ПараметрыОткрытия.Вставить("ТекстЗапроса", ВыделенныйТекст);
	
	ОписаниеОповещенияОЗакрытии = Новый ОписаниеОповещения("УИ_КонструкторПредставленийЗавершение",
														   ЭтотОбъект,
														   ДополнительныеПараметры);
	ОткрытьФорму("Обработка.УИ_КонструкторПредставленийЗарплатаКадры.Форма",
				 ПараметрыОткрытия,
				 ЭтотОбъект, , , ,
				 ОписаниеОповещенияОЗакрытии);
КонецПроцедуры

// Вставляет код замены представлений в алгоритм перед выполнением.
//
// Параметры:
//   Команда - КомандаФормы - Команда, инициировавшая вставку кода
&НаКлиенте
Процедура УИ_ВставитьКодЗаменыПредставлений(Команда)
	УИ_ДобавитьКодЗаменыПредставленийВАлгоритмПередВыполнением(Не УИ_ВставленКодЗаменыПредставлений);
КонецПроцедуры

// Заменяет запросы к представлениям виртуальных таблиц на реальные запросы запросы.
//
// Параметры:
//   Команда - КомандаФормы - Команда, инициировавшая выполнение процедуры
&НаКлиенте
Процедура УИ_ЗаменитьЗапросыКПредставлениямВиртуальныхТаблиц(Команда)
	ТекущийТекстЗапроса = УИ_РедакторКодаКлиент.ТекстКодаРедактораЭлементаФормы(ЭтотОбъект,
																						 Элементы.ТекстЗапроса);
	Если Не ПустаяСтрока(ТекущийТекстЗапроса) Тогда
		Запрос = УИ_ЗаменитьЗапросыКПредставлениямВиртуальныхТаблицНаСервере(ТекущийТекстЗапроса);
		
		
		УИ_РедакторКодаКлиент.УстановитьТекстРедактораЭлементаФормы(ЭтотОбъект,
																	Элементы.ТекстЗапроса,
																	Запрос.Текст);
																	
		ПараметрыОтбора = Новый Структура("Имя");
		Для Каждого Параметр Из Запрос.Параметры Цикл
			ПараметрыОтбора.Имя = Параметр.Имя;
			Если ПараметрыЗапроса.НайтиСтроки(ПараметрыОтбора).Количество() = 0 Тогда
				ЗаполнитьЗначенияСвойств(ПараметрыЗапроса.Добавить(), Параметр);		
			КонецЕсли;	
		КонецЦикла;
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

&НаКлиенте
Процедура Команда_ВыполнитьОбработкуЗавершениеПодключенияОбработокИсполнения(Результат, ДополнительныеПараметры) Экспорт
	Если Результат <> Истина Тогда
		Возврат;
	КонецЕсли;
	
	Если МетодИсполненияКода = 0 Тогда
		стРезультат = ВыполнитьАлгоритм(ТекущийТекстАлгоритма());
	ИначеЕсли МетодИсполненияКода = 1 Тогда
		стРезультат = ВыполнитьАлгоритмПострочно(АдресРезультатаЗапроса, РезультатВПакете, ТекущийТекстАлгоритма());
	ИначеЕсли МетодИсполненияКода = 2 Тогда
		стРезультат = ВыполнитьАлгоритмПострочноСИндикацией();
	ИначеЕсли МетодИсполненияКода = 3 Тогда
		//простое выполнение в фоне
		стРезультат = ЗапуститьОбработкуНаСервере(ТекущийТекстАлгоритма(), Ложь);
	ИначеЕсли МетодИсполненияКода = 4 Тогда
		//построчное выполнение в фоне с индикацией
		стРезультат = ЗапуститьОбработкуНаСервере(ТекущийТекстАлгоритма(), Истина);
	Иначе
		стРезультат = Новый Структура("Успешно, ОписаниеОшибки", Ложь, "Неверный метод исполнения кода");
	КонецЕсли;

	Если МетодИсполненияКода = 3 Или МетодИсполненияКода = 4 Тогда
		Если стРезультат.Успешно Тогда
			Элементы.ВыполнитьОбработку.Заголовок = "Прервать";
			//Картинки = ПолучитьИзВременногоХранилища(Объект.Картинки);
			//Элементы.ВыполнитьОбработку.Картинка = Картинки.ПрогрессВыполнения;
			Элементы.ВыполнитьОбработку.Картинка = БиблиотекаКартинок.Остановить;
			ОтобразитьСостояниеФоновогоЗадания();
		КонецЕсли;
	КонецЕсли;

	Если Не стРезультат.Успешно Тогда
		ПоказатьПредупреждениеКонсоли(стРезультат.ОписаниеОшибки);
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура УИ_ЗаполнитьДаннымиОтладки()
	Если Не Параметры.Свойство("ДанныеОтладки") Тогда
		Возврат;
	КонецЕсли;

	Если Объект.СохраняемыеСостояния = Неопределено Тогда
		Объект.СохраняемыеСостояния = Новый Структура;
	КонецЕсли;

	Модифицированность = Ложь;

	ОпцияИнтервалАвтосохранения = 60;
	ОпцияСохранятьКомментарии = Истина;
	ОпцияАвтосохранениеПередВыполнениемЗапроса = Истина;
	ОпцияИнтервалОбновленияВыполненияАлгоритма = 1000;
	Объект.ОпцияОбрабатывать__ = Истина;
	Объект.ОпцияИнтервалОбновленияВыполненияАлгоритма = 1000;

	ОбработкаОбъект=РеквизитФормыВЗначение("Объект");

	УИ_Отладка=Истина;

	ДанныеОтладки=ПолучитьИзВременногоХранилища(Параметры.ДанныеОтладки);

	СтрокиДерева=ПакетЗапросов.ПолучитьЭлементы();

	НоваяСтрока=СтрокиДерева.Добавить();
	НоваяСтрока.Имя="Отладка";
	НоваяСтрока.ТекстЗапроса=ДанныеОтладки.Текст;
	НоваяСтрока.ПараметрыЗапроса=Новый СписокЗначений;

	Если ДанныеОтладки.Свойство("Параметры") Тогда
		Для Каждого ТекПараметр Из ДанныеОтладки.Параметры Цикл

			НовыйПараметр=Новый Структура;
			НовыйПараметр.Вставить("Использовать", Истина);
			НовыйПараметр.Вставить("Имя", ТекПараметр.Ключ);
			НовыйПараметр.Вставить("ТипКонтейнера", ПолучитьКодФормыЗначения(ТекПараметр.Значение));

			НовыйПараметр.Вставить("Контейнер", ОбработкаОбъект.Контейнер_СохранитьЗначение(ТекПараметр.Значение));

			Если НовыйПараметр.ТипКонтейнера = 2 Тогда
				МассивТипов=Новый Массив;

				Для Каждого ЗначениеМассива Из ТекПараметр.Значение Цикл
					ТекТип=ТипЗнч(ЗначениеМассива);
					Если МассивТипов.Найти(ТекТип) = Неопределено Тогда
						МассивТипов.Добавить(ТекТип);
					КонецЕсли;
				КонецЦикла;

				НовыйПараметр.Вставить("ТипЗначения", Новый ОписаниеТипов(МассивТипов));
				НовыйПараметр.Вставить("Значение", НовыйПараметр.Контейнер.Представление);
			ИначеЕсли НовыйПараметр.ТипКонтейнера = 1 Тогда
				МассивТипов=Новый Массив;

				Для Каждого ЭлементСписка Из ТекПараметр.Значение Цикл
					ТекТип=ТипЗнч(ЭлементСписка.Значение);
					Если МассивТипов.Найти(ТекТип) = Неопределено Тогда
						МассивТипов.Добавить(ТекТип);
					КонецЕсли;
				КонецЦикла;

				НовыйПараметр.Вставить("ТипЗначения", Новый ОписаниеТипов(МассивТипов));
				НовыйПараметр.Вставить("Значение", НовыйПараметр.Контейнер.Представление);
			ИначеЕсли НовыйПараметр.ТипКонтейнера = 3 Тогда
				НовыйПараметр.Вставить("ТипЗначения", "Таблица значений");
				НовыйПараметр.Вставить("Значение", НовыйПараметр.Контейнер.Представление);
			Иначе
				НовыйПараметр.Вставить("ТипЗначения", ОписаниеТиповПоТипу(ТипЗнч(ТекПараметр.Значение)));
				НовыйПараметр.Вставить("Значение", НовыйПараметр.Контейнер);

			КонецЕсли;
			НоваяСтрока.ПараметрыЗапроса.Добавить(НовыйПараметр);
		КонецЦикла;
	КонецЕсли;

	Если ДанныеОтладки.Свойство("ВременныеТаблицы") Тогда
		НоваяСтрока.ВременныеТаблицы=Новый СписокЗначений;

		Для Каждого КлючЗначение Из ДанныеОтладки.ВременныеТаблицы Цикл
			ВременнаяТаблица=Новый Структура;
			ВременнаяТаблица.Вставить("Имя", КлючЗначение.Ключ);
			ВременнаяТаблица.Вставить("Контейнер", ОбработкаОбъект.Контейнер_СохранитьЗначение(КлючЗначение.Значение));
			ВременнаяТаблица.Вставить("Значение", ВременнаяТаблица.Контейнер.Представление);

			НоваяСтрока.ВременныеТаблицы.Добавить(ВременнаяТаблица);
		КонецЦикла;
	КонецЕсли;

КонецПроцедуры

&НаСервере
Процедура УИ_ЗаполнитьЗапросыИзСКД()
	Если Не Параметры.Свойство("АдресЗапросовИзСКД") Тогда
		Возврат;
	КонецЕсли;
	
	МассивЗапросовИзСКД = ПолучитьИзВременногоХранилища(Параметры.АдресЗапросовИзСКД);

	Если Объект.СохраняемыеСостояния = Неопределено Тогда
		Объект.СохраняемыеСостояния = Новый Структура;
	КонецЕсли;

	Модифицированность = Ложь;

	ОпцияИнтервалАвтосохранения = 60;
	ОпцияСохранятьКомментарии = Истина;
	ОпцияАвтосохранениеПередВыполнениемЗапроса = Истина;
	ОпцияИнтервалОбновленияВыполненияАлгоритма = 1000;
	Объект.ОпцияОбрабатывать__ = Истина;
	Объект.ОпцияИнтервалОбновленияВыполненияАлгоритма = 1000;

	ОбработкаОбъект=РеквизитФормыВЗначение("Объект");

	УИ_Отладка=Истина;

	СтрокиДерева=ПакетЗапросов.ПолучитьЭлементы();
	
	Для Каждого ДанныеЗапроса Из МассивЗапросовИзСКД Цикл

		НоваяСтрока=СтрокиДерева.Добавить();
		НоваяСтрока.Имя=ДанныеЗапроса.Имя;
		НоваяСтрока.ТекстЗапроса=ДанныеЗапроса.Текст;
		НоваяСтрока.ПараметрыЗапроса=Новый СписокЗначений;
	
		Если ДанныеЗапроса.Свойство("Параметры") Тогда
			Для Каждого ТекПараметр Из ДанныеЗапроса.Параметры Цикл
	
				НовыйПараметр=Новый Структура;
				НовыйПараметр.Вставить("Использовать", Истина);
				НовыйПараметр.Вставить("Имя", ТекПараметр.Ключ);
				НовыйПараметр.Вставить("ТипКонтейнера", ПолучитьКодФормыЗначения(ТекПараметр.Значение));
	
				НовыйПараметр.Вставить("Контейнер", ОбработкаОбъект.Контейнер_СохранитьЗначение(ТекПараметр.Значение));
	
				Если НовыйПараметр.ТипКонтейнера = 2 Тогда
					МассивТипов=Новый Массив;
	
					Для Каждого ЗначениеМассива Из ТекПараметр.Значение Цикл
						ТекТип=ТипЗнч(ЗначениеМассива);
						Если МассивТипов.Найти(ТекТип) = Неопределено Тогда
							МассивТипов.Добавить(ТекТип);
						КонецЕсли;
					КонецЦикла;
	
					НовыйПараметр.Вставить("ТипЗначения", Новый ОписаниеТипов(МассивТипов));
					НовыйПараметр.Вставить("Значение", НовыйПараметр.Контейнер.Представление);
				ИначеЕсли НовыйПараметр.ТипКонтейнера = 1 Тогда
					МассивТипов=Новый Массив;
	
					Для Каждого ЭлементСписка Из ТекПараметр.Значение Цикл
						ТекТип=ТипЗнч(ЭлементСписка.Значение);
						Если МассивТипов.Найти(ТекТип) = Неопределено Тогда
							МассивТипов.Добавить(ТекТип);
						КонецЕсли;
					КонецЦикла;
	
					НовыйПараметр.Вставить("ТипЗначения", Новый ОписаниеТипов(МассивТипов));
					НовыйПараметр.Вставить("Значение", НовыйПараметр.Контейнер.Представление);
				ИначеЕсли НовыйПараметр.ТипКонтейнера = 3 Тогда
					НовыйПараметр.Вставить("ТипЗначения", "Таблица значений");
					НовыйПараметр.Вставить("Значение", НовыйПараметр.Контейнер.Представление);
				Иначе
					НовыйПараметр.Вставить("ТипЗначения", ОписаниеТиповПоТипу(ТипЗнч(ТекПараметр.Значение)));
					НовыйПараметр.Вставить("Значение", НовыйПараметр.Контейнер);
	
				КонецЕсли;
				НоваяСтрока.ПараметрыЗапроса.Добавить(НовыйПараметр);
			КонецЦикла;
		КонецЕсли;
	
	КонецЦикла;

КонецПроцедуры

#Область СобытияФормы

&НаКлиенте
Процедура ПодключитьОбработчикАвтосохранения()
	Если ОпцияИнтервалАвтосохранения > 0 Тогда
		ПодключитьОбработчикОжидания("ОбработчикАвтосохранения", ОпцияИнтервалАвтосохранения);
	Иначе
		ОтключитьОбработчикОжидания("ОбработчикАвтосохранения");
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ЗакончитьПолучениеРабочегоКаталогаДанныхПользователя(КаталогДанныхПользователя, ДополнительныеПараметры) Экспорт
	ДополнительныеПараметры.Вставить("КаталогДанныхПользователя", КаталогДанныхПользователя);
	ВыполнитьПродолжение(ДополнительныеПараметры);
КонецПроцедуры

&НаКлиенте
Процедура ЗакончитьПроверкуСуществования(Существует, ДополнительныеПараметры) Экспорт
	ДополнительныеПараметры.Вставить("Существует", Существует);
	ВыполнитьПродолжение(ДополнительныеПараметры);
КонецПроцедуры



&НаКлиенте
Процедура ПослеЗавершенияПодключенияРасширенияРаботыСФайлами(Подключено, ДополнительныеПараметры) Экспорт

	РасширениеДляРаботыСФайламиПодключено = Подключено;

	Если Не РасширениеДляРаботыСФайламиПодключено Тогда
		ПоказатьПредупреждениеКонсоли("Для работы консоли необходимо установить расширение работы с файлами.");
		НачатьУстановкуРасширенияРаботыСФайлами();
		Закрыть();
		Возврат;
	КонецЕсли;

	ПриОткрытииПродолжение();

КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытииПродолжение(ДополнительныеПараметры = Неопределено) Экспорт

	Если Не ЗначениеЗаполнено(ДополнительныеПараметры) Тогда

		ДополнительныеПараметры = Новый Структура("Продолжение, ТочкаПродолжения", "ПриОткрытииПродолжение",
			"ПослеПолученияРабочегоКаталога");
		ОписаниеОповещения = Новый ОписаниеОповещения("ЗакончитьПолучениеРабочегоКаталогаДанныхПользователя", ЭтаФорма,
			ДополнительныеПараметры);
		НачатьПолучениеРабочегоКаталогаДанныхПользователя(ОписаниеОповещения);
		Возврат;

	ИначеЕсли ДополнительныеПараметры.ТочкаПродолжения = "ПослеПолученияРабочегоКаталога" Тогда

		КаталогДанныхПользователя = ДополнительныеПараметры.КаталогДанныхПользователя;
		ИмяФайлаАвтосохраненияСостояния = КаталогДанныхПользователя + СигнатураКонсоли + "." + РасширениеАвтосохранения;

		стрИмяФайлаАвтосохраненияТемп = ИмяФайлаАвтосохраненияСостояния;
		Файл = Новый Файл(стрИмяФайлаАвтосохраненияТемп);
		ДополнительныеПараметры = Новый Структура("Продолжение, ТочкаПродолжения", "ПриОткрытииПродолжение",
			"ПослеПроверкиСуществованияСохранения");
		ОписаниеОповещения = Новый ОписаниеОповещения("ЗакончитьПроверкуСуществования", ЭтаФорма,
			ДополнительныеПараметры);
		Файл.НачатьПроверкуСуществования(ОписаниеОповещения);
		Возврат;

	ИначеЕсли ДополнительныеПараметры.ТочкаПродолжения = "ПослеПроверкиСуществованияСохранения" Тогда
		Если УИ_Отладка Тогда
			УстановитьИмяФайлаЗапросов();
			ПриОткрытииЗавершение();
			Возврат;
		КонецЕсли;

		Если Не ДополнительныеПараметры.Существует Тогда
			ПакетЗапросов_Новый();
			ПриОткрытииЗавершение();
			Возврат;
		КонецЕсли;

		стрИмяФайлаАвтосохраненияТемп = ИмяФайлаАвтосохраненияСостояния;
		Попытка
			ДополнительныеПараметры = Новый Структура("Продолжение, ТочкаПродолжения, ИмяФайла",
				"ПриОткрытииПродолжение", "ПослеЗагрузкиЗаголовка", стрИмяФайлаАвтосохраненияТемп);
			ПакетЗапросов_Загрузить(ДополнительныеПараметры);
		Исключение
			//Состояние прочитать не удалось, файл испорчен.
			ПакетЗапросов_Новый();
			ПриОткрытииЗавершение();
		КонецПопытки;

		Возврат;

	ИначеЕсли ДополнительныеПараметры.ТочкаПродолжения = "ПослеЗагрузкиЗаголовка" Тогда

		стЗаголовок = ДополнительныеПараметры.ЗагруженныеДанные;
		Если стЗаголовок = Неопределено Тогда
			//Состояние прочитать не удалось, файл испорчен.
			ПакетЗапросов_Новый();
			ПриОткрытииЗавершение();
			Возврат;
		КонецЕсли;

		Если стЗаголовок.Свойство("ПакетЗапросов") Тогда

			Модифицированность = Истина;
			ПриОткрытииЗавершение();//Загружено автосохранение из темп, список запросов в файл не сохранялся.
			Возврат;

		Иначе

			ИмяФайлаЗапросов = стЗаголовок.ИмяФайла;
			УстановитьИмяФайлаЗапросов(ИмяФайлаЗапросов);
			стрИмяФайлаАвтосохранения = ПолучитьИмяФайлаАвтосохранения(ИмяФайлаЗапросов);

			Файл = Новый Файл(стрИмяФайлаАвтосохранения);
			ДополнительныеПараметры = Новый Структура("Продолжение, ТочкаПродолжения, ИмяФайлаАвтосохранения",
				"ПриОткрытииПродолжение", "ПослеПроверкиСуществованияАвтосохранения", стрИмяФайлаАвтосохранения);
			ОписаниеОповещения = Новый ОписаниеОповещения("ЗакончитьПроверкуСуществования", ЭтаФорма,
				ДополнительныеПараметры);
			Файл.НачатьПроверкуСуществования(ОписаниеОповещения);
			Возврат;

		КонецЕсли;

	ИначеЕсли ДополнительныеПараметры.ТочкаПродолжения = "ПослеПроверкиСуществованияАвтосохранения" Тогда

		Попытка
			Если ДополнительныеПараметры.Существует Тогда
				стрИмяФайлаАвтосохранения = ДополнительныеПараметры.ИмяФайлаАвтосохранения;
				ДополнительныеПараметры = Новый Структура("Продолжение, ТочкаПродолжения, ИмяФайла",
					"ПриОткрытииПродолжение", "ПослеЗагрузкиАвтосохранения", стрИмяФайлаАвтосохранения);
				ПакетЗапросов_Загрузить(ДополнительныеПараметры);
				Возврат;
			КонецЕсли;
		Исключение
			//Автосохранение не загрузили - файл испорчен. Грузим основной файл.
		КонецПопытки;

		ДополнительныеПараметры = Новый Структура("Продолжение, ТочкаПродолжения, ЗагруженныеДанные",
			"ПриОткрытииПродолжение", "ПослеЗагрузкиАвтосохранения");
		ВыполнитьПродолжение(ДополнительныеПараметры);
		Возврат;

	ИначеЕсли ДополнительныеПараметры.ТочкаПродолжения = "ПослеЗагрузкиАвтосохранения" Тогда

		Если ДополнительныеПараметры.ЗагруженныеДанные <> Неопределено Тогда
			Модифицированность = Истина;
			ПриОткрытииЗавершение();//Загружено из автосохранения измененного файла.
			Возврат;
		КонецЕсли;

		Файл = Новый Файл(ИмяФайлаЗапросов);
		ДополнительныеПараметры = Новый Структура("Продолжение, ТочкаПродолжения", "ПриОткрытииПродолжение",
			"ПослеПроверкиСуществованияФайла");
		ОписаниеОповещения = Новый ОписаниеОповещения("ЗакончитьПроверкуСуществования", ЭтаФорма,
			ДополнительныеПараметры);
		Файл.НачатьПроверкуСуществования(ОписаниеОповещения);

	ИначеЕсли ДополнительныеПараметры.ТочкаПродолжения = "ПослеПроверкиСуществованияФайла" Тогда

		Если ДополнительныеПараметры.Существует Тогда
			ДополнительныеПараметры = Новый Структура("Продолжение, ТочкаПродолжения, ИмяФайла",
				"ПриОткрытииПродолжение", "ПослеЗагрузкиОсновногоФайла", ИмяФайлаЗапросов);
			ПакетЗапросов_Загрузить(ДополнительныеПараметры);
			Возврат;
		Иначе
			ПакетЗапросов_Новый();
			ПриОткрытииЗавершение();//Не найден файл, который в информации последнего состояния (перемещен или удален). Значит, будет новый пакет.
			Возврат;
		КонецЕсли;

	ИначеЕсли ДополнительныеПараметры.ТочкаПродолжения = "ПослеЗагрузкиОсновногоФайла" Тогда

		Если ДополнительныеПараметры.ЗагруженныеДанные = Неопределено Тогда
			ПакетЗапросов_Новый();
		КонецЕсли;

		ПриОткрытииЗавершение();//Загружено из основного файла.
		Возврат;

	КонецЕсли;

КонецПроцедуры

&НаСервере
Процедура ПриОткрытииЗавершениеНаСервере()

	Обработка = РеквизитФормыВЗначение("Объект");
	
	//Сохраняемые значения +++

	ВидРезультата = СохраняемыеСостояния_ПолучитьНаСервере("ВидРезультата", "таблица");
	ОграничениеВыводимыхСтрок = СохраняемыеСостояния_ПолучитьНаСервере("ОграничениеВыводимыхСтрок", "1000");
	ОграничениеВыводимыхСтрокВкл = СохраняемыеСостояния_ПолучитьНаСервере("ОграничениеВыводимыхСтрокВкл", Истина);
	ОграничениеВыводимыхСтрокПервые = СохраняемыеСостояния_ПолучитьНаСервере("ОграничениеВыводимыхСтрокПервые", 1000);
	ОграничениеВыводимыхСтрокПервыеВкл = СохраняемыеСостояния_ПолучитьНаСервере("ОграничениеВыводимыхСтрокПервыеВкл",
		Ложь);

	фВидимостьПакетаРезультатаЗапроса = СохраняемыеСостояния_ПолучитьНаСервере("ВидимостьПакетаРезультатаЗапроса", Ложь);
	Если Элементы.ОтобразитьСкрытьПакетРезультатаЗапроса.Пометка <> фВидимостьПакетаРезультатаЗапроса Тогда
		Элементы.ОтобразитьСкрытьПакетРезультатаЗапроса.Пометка = фВидимостьПакетаРезультатаЗапроса;
		Элементы.ПакетРезультатаЗапроса.Видимость = фВидимостьПакетаРезультатаЗапроса;
		Элементы.ГруппаРезультатВПакете.Видимость = Не фВидимостьПакетаРезультатаЗапроса;
	КонецЕсли;

	фПараметрыЗапросаРядомСТекстом = СохраняемыеСостояния_ПолучитьНаСервере("ПараметрыЗапросаРядомСТекстом", Истина);
	Если Элементы.ПараметрыЗапросаРядомСТекстом.Пометка <> фПараметрыЗапросаРядомСТекстом Тогда
		Элементы.ПараметрыЗапросаРядомСТекстом.Пометка = фПараметрыЗапросаРядомСТекстом;
		ПараметрыЗапросаРядомСТекстомНаСервере();
	КонецЕсли;
	
	//Сохраняемые значения ---
	
	//При проверке ТЖ в момент запуска маскируем все исключения.
	//Может быть нехватка прав, или что-то другое, а ТЖ реально вообще не нужен.
	Попытка
		Если Обработка.ТехнологическийЖурнал_ЕстьЛогКонсоли() Тогда
			Элементы.ТехнологическийЖурнал.Пометка = Истина;
		КонецЕсли;
	Исключение
	КонецПопытки;

	ЗначениеВРеквизитФормы(Обработка, "Объект");

КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытииЗавершение()

	ПриОткрытииЗавершениеНаСервере();
	ПолучитьИмяФайлаОбработкиНаСервере();
	ПодключитьОбработчикАвтосохранения();
	УстановитьСостоянияЭлементов();

	Если Элементы.ТехнологическийЖурнал.Пометка Тогда
		ТехнологическийЖурналВремяВключенияВыключения = ТекущаяУниверсальнаяДатаВМиллисекундах();
		ТехнологическийЖурнал_Включился(); // Что бы выполнился тестовый запрос, а через 1 секунду уже проверим результат.
		ПодключитьОбработчикОжидания("ТехнологическийЖурнал_ОжиданиеВключения", 1, Истина);
	КонецЕсли;
	
	//Почему-то релиз 8.3.17 без режима совместимости не устанавливает изначально текущую строку.
	Если Элементы.ПакетЗапросов.ТекущаяСтрока = Неопределено И ПакетЗапросов.ПолучитьЭлементы().Количество() > 0 Тогда
		Элементы.ПакетЗапросов.ТекущаяСтрока = ПакетЗапросов.ПолучитьЭлементы()[0].ПолучитьИдентификатор();
	КонецЕсли;

	Если Не Объект.РежимЗапускаВнешняяОбработка Тогда
		РазрешитьПерехват();
		РазрешитьВыполнениеВФоне();
	КонецЕсли;

	Доступность = Истина;

#Область УИ_ПриОткрытии
	УИ_РедакторКодаКлиент.ФормаПриОткрытии(ЭтотОбъект);
#КонецОбласти

КонецПроцедуры


&НаКлиенте
Процедура ОбработчикАвтосохранения() Экспорт

	Если Модифицированность Тогда
		Автосохранить();
	КонецЕсли;

КонецПроцедуры


#КонецОбласти

//@skip-warning
&НаКлиенте
Процедура Подключаемый_ВыполнитьОбщуюКомандуИнструментов(Команда)
	УИ_ОбщегоНазначенияКлиент.Подключаемый_ВыполнитьОбщуюКомандуИнструментов(ЭтотОбъект, Команда);
КонецПроцедуры


#Область РедакторКода

//@skip-warning
&НаКлиенте
Процедура Подключаемый_ПолеРедактораДокументСформирован(Элемент)
	УИ_РедакторКодаКлиент.ПолеРедактораHTMLДокументСформирован(ЭтотОбъект, Элемент);
КонецПроцедуры

//@skip-warning
&НаКлиенте
Процедура Подключаемый_ПолеРедактораПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
	УИ_РедакторКодаКлиент.ПолеРедактораHTMLПриНажатии(ЭтотОбъект, Элемент, ДанныеСобытия, СтандартнаяОбработка);
КонецПроцедуры

//@skip-warning
&НаКлиенте
Процедура Подключаемый_РедакторКодаОтложеннаяИнициализацияРедакторов()
	УИ_РедакторКодаКлиент.РедакторКодаОтложеннаяИнициализацияРедакторов(ЭтотОбъект);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_РедакторКодаЗавершениеИнициализацииРедактора(ИдентификаторРедактора) Экспорт
	Элементы.ГруппаКоманднаяПанельКода.Видимость = Ложь;
	
	ВидРедактора = УИ_РедакторКодаКлиентСервер.ВидРедактораКодаФормы(ЭтотОбъект);
	Если УИ_РедакторКодаКлиентСервер.РедакторКодаИспользуетПолеHTML(ВидРедактора) Тогда
		Элементы.ТекстЗапросаКонтекстноеМенюКонструкторЗапросов.Видимость = Ложь;
		Элементы.ТекстЗапросаКонтекстноеМенюСинтаксическийКонтрольЗапроса.Видимость = Ложь;
		Элементы.ТекстЗапросаКонтекстноеМенюФорматироватьТекстЗапроса.Видимость = Ложь;
	КонецЕсли;

	ТекущаяСтрока = Элементы.ПакетЗапросов.ТекущаяСтрока;
	Если ТекущаяСтрока = Неопределено Тогда
		Возврат;
	КонецЕсли;

	стДанныеЗапроса = Запрос_ПолучитьДанныеЗапроса(ТекущаяСтрока);

	УстановитьТекстАлгоритма(стДанныеЗапроса.ТекстКод, Истина, стДанныеЗапроса.ТекстКодОригинальный);
	УстановитьТекстЗапроса(стДанныеЗапроса.Запрос, Истина, стДанныеЗапроса.ЗапросОригинальный);
	
	УстановитьТекстАлгоритмаПередВыполнением(стДанныеЗапроса.АлгоритмПередВыполнением, Истина,
		стДанныеЗапроса.АлгоритмПередВыполнениемОригинальный);

КонецПроцедуры



&НаКлиенте
Процедура Подключаемый_РедакторКодаОтложеннаяОбработкаСобытийРедактора() Экспорт
	УИ_РедакторКодаКлиент.ОтложеннаяОбработкаСобытийРедактора(ЭтотОбъект);
КонецПроцедуры



#КонецОбласти



&НаКлиенте
Функция ПолучитьИмяФайлаАвтосохранения(ИмяФайла)
	Файл = Новый Файл(ИмяФайла);
	Возврат Файл.Путь + Файл.ИмяБезРасширения + "." + РасширениеАвтосохранения;
КонецФункции

&НаКлиенте
Функция ВремяИзСекунд(Секунды)
	СтрокаВремяСекунды = Формат(Секунды % 60, "ЧЦ=2; ЧН=; ЧВН=");
	Минуты = Цел(Секунды / 60);
	СтрокаВремяМинуты = Формат(Минуты % 60, "ЧЦ=2; ЧН=; ЧВН=");
	Часы = Цел(Минуты / 60);
	СтрокаВремяЧасы = Формат(Часы, "ЧН=00; ЧГ=");
	Возврат СтрШаблон("%1:%2:%3", СтрокаВремяЧасы, СтрокаВремяМинуты, СтрокаВремяСекунды);
КонецФункции

&НаСервере
Функция ПоместитьОбработкуНаСервер(Адрес)

	Файл = Новый Файл(Объект.ИмяФайлаОбработки);
	СтрокаИмяФайлаОбработкиНаСервере = КаталогВременныхФайлов() + Файл.ИмяБезРасширения + "_" + Объект.ВерсияОбработки
		+ Файл.Расширение;
	ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);
	ДвоичныеДанные.Записать(СтрокаИмяФайлаОбработкиНаСервере);

	Возврат СтрокаИмяФайлаОбработкиНаСервере;

КонецФункции

&НаКлиенте
Функция ПолучитьИмяФайлаОбработкиНаСервере()

	Если ЗначениеЗаполнено(ИмяФайлаОбработкиНаСервере) Тогда
		Возврат ИмяФайлаОбработкиНаСервере;
	КонецЕсли;

	Попытка

		Если ЗначениеЗаполнено(Объект.ИмяФайлаОбработки) Тогда
			Адрес = "";
			НачатьПомещениеФайла(Новый ОписаниеОповещения("ПоместитьОбработкуНаСерверПродолжение", ЭтаФорма), Адрес,
				Объект.ИмяФайлаОбработки, Ложь);
		КонецЕсли;

	Исключение
	КонецПопытки;

	Возврат Неопределено;

КонецФункции

&НаКлиенте
Процедура РазрешитьПерехват()
	Элементы.ПакетЗапросовПодменюПерехват.Доступность = Истина;
КонецПроцедуры

&НаКлиенте
Процедура РазрешитьВыполнениеВФоне()
	Элементы.МетодИсполненияКода.СписокВыбора.Добавить(3, "простое в фоне (БСП 2.3)");
	Элементы.МетодИсполненияКода.СписокВыбора.Добавить(4, "построчно в фоне с индикацией (БСП 2.3)");
КонецПроцедуры

&НаКлиенте
Процедура ПоместитьОбработкуНаСерверПродолжение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт

	ИмяФайлаОбработкиНаСервере = ПоместитьОбработкуНаСервер(Адрес);
	
	//Обработка помещена на сервер. Значит, можно делать перехват и выполнение в фоне.
	РазрешитьПерехват();
	РазрешитьВыполнениеВФоне();

КонецПроцедуры

&НаКлиенте
Функция ПолноеИмяФормы(ИмяФормы)
	Возврат СтрШаблон("%1.Форма.%2", Объект.ПутьМетаданных, ИмяФормы);
КонецФункции

&НаКлиенте
Процедура ПоказатьПредупреждениеКонсоли(ТекстПредупреждения) Экспорт
	ПоказатьПредупреждение( , ТекстПредупреждения, , Объект.Заголовок);
КонецПроцедуры

&НаКлиенте
Функция НайтиВДереве(ЭлементДерева, ИмяРеквизита, Значение, ИдентификаторСтрокиИсключения = Неопределено)

	Для Каждого Элемент Из ЭлементДерева.ПолучитьЭлементы() Цикл

		Строка = НайтиВДереве(Элемент, ИмяРеквизита, Значение, ИдентификаторСтрокиИсключения);
		Если Строка <> Неопределено Тогда
			Возврат Строка;
		КонецЕсли;

		Если Элемент[ИмяРеквизита] = Значение Тогда
			ИдентификаторСтроки = Элемент.ПолучитьИдентификатор();
			Если ИдентификаторСтроки <> ИдентификаторСтрокиИсключения Тогда
				Возврат ИдентификаторСтроки;
			КонецЕсли;
		КонецЕсли;

	КонецЦикла;

	Возврат Неопределено;

КонецФункции

&НаСервереБезКонтекста
Функция ФорматироватьДлительность(ДлительностьВМиллисекундах)

	Возврат СтрШаблон("%1.%2", Формат('00010101' + Цел((ДлительностьВМиллисекундах) / 1000), "ДЛФ=T; ДП=0:00:00"),
		Формат(ДлительностьВМиллисекундах - Цел((ДлительностьВМиллисекундах) / 1000) * 1000, "ЧЦ=3; ЧН=; ЧВН="));

КонецФункции

&НаСервереБезКонтекста
Функция ОписаниеТиповПоТипу(Тип)
	маТипы = Новый Массив;
	маТипы.Добавить(Тип);
	Возврат Новый ОписаниеТипов(маТипы);
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ИмяКорректно(ПроверяемоеИмя)

	Если Не ЗначениеЗаполнено(ПроверяемоеИмя) Тогда
		Возврат Ложь;
	КонецЕсли;

	Попытка
		//@skip-warning
		ст = Новый Структура(ПроверяемоеИмя);
	Исключение
		Возврат Ложь;
	КонецПопытки;

	Возврат Истина;

КонецФункции

&НаСервереБезКонтекста
Функция ПолучитьКодФормыЗначения(Знач Значение)

	ТипЗначения = ТипЗнч(Значение);
	Если ТипЗначения = Тип("Массив") Тогда
		Возврат 2;
	ИначеЕсли ТипЗначения = Тип("СписокЗначений") Тогда
		Возврат 1;
	ИначеЕсли ТипЗначения = Тип("ТаблицаЗначений") Тогда
		Возврат 3;
	КонецЕсли;

	Возврат 0;

КонецФункции

&НаСервереБезКонтекста
Процедура РазобратьОшибкуЗапроса(СтрокаОшибки, НомерСтроки, НомерКолонки)

	маЧасти = СтрРазделить(СтрокаОшибки, ":");
	маКоординаты = Неопределено;
	Если маЧасти.Количество() > 2 Тогда
		СтрокаКоординатОшибки = СокрЛП(маЧасти[2]);
		Если маЧасти.Количество() > 2 И СтрДлина(СтрокаКоординатОшибки) > 5 И Лев(СтрокаКоординатОшибки, 2) = "{(" Тогда
			маКоординаты = СтрРазделить(Сред(СтрокаКоординатОшибки, 3, СтрДлина(СтрокаКоординатОшибки) - 4), ",");
			маЧасти[0] = "";
			маЧасти[1] = "";
		Иначе
			маЧасти[0] = "";
		КонецЕсли;
	КонецЕсли;

	Разделитель = ": ";
	СтрокаОшибки = СтрСоединить(маЧасти, Разделитель);
	Пока Лев(СтрокаОшибки, СтрДлина(Разделитель)) = Разделитель Цикл
		СтрокаОшибки = Прав(СтрокаОшибки, СтрДлина(СтрокаОшибки) - СтрДлина(Разделитель));
	КонецЦикла;

	НомерСтроки = Неопределено;
	НомерКолонки = Неопределено;
	Если маКоординаты <> Неопределено Тогда
		НомерСтроки = Число(маКоординаты[0]);
		НомерКолонки = Число(маКоординаты[1]);
	КонецЕсли;

КонецПроцедуры

//Уточняет место ошибки в тексте запроса по оригинальному тексту запроса, попытавшись выполнить его.
//СтрокаОшибки - уже произошедшая ошибка (возвращает уточнение)
//Запрос - запрос с параметрами (текст не важен)
//ОригинальныйТекстЗапроса - оригинальный текст запроса
//НомерСтроки, НомерСтроки - место ошибки (возвращаемое значение)
&НаСервереБезКонтекста
Процедура РазобратьОшибкуЗапросаСУточнением(СтрокаОшибки, Запрос, ОригинальныйТекстЗапроса, НомерСтроки, НомерКолонки)

	РазобратьОшибкуЗапроса(СтрокаОшибки, НомерСтроки, НомерКолонки);
	СтрокаОшибкаРеальная = СтрокаОшибки;
	НомерРеальнойСтроки = НомерСтроки;
	НомерРеальнойКолонки = НомерКолонки;

	Запрос.Текст = ОригинальныйТекстЗапроса;
	Попытка
		Запрос.НайтиПараметры();
		Запрос.Выполнить();
	Исключение
		СтрокаОшибки = ОписаниеОшибки();
	КонецПопытки;

	РазобратьОшибкуЗапроса(СтрокаОшибки, НомерСтроки, НомерКолонки);

	маЧастиРеальной = СтрРазделить(СтрокаОшибкаРеальная, ":");
	маЧастиУточненной = СтрРазделить(СтрокаОшибки, ":");
	Если маЧастиРеальной.Количество() = маЧастиУточненной.Количество() И маЧастиРеальной.Количество() > 1
		И маЧастиРеальной[1] = маЧастиУточненной[1] Тогда
		 	//Все совпало, ошибку воспроизвели на оригинальном запросе, сообщения и позиция верные.
		Возврат;
	КонецЕсли;

	СтрокаОшибки = СтрокаОшибкаРеальная;
	НомерСтроки = НомерРеальнойСтроки;
	НомерКолонки = НомерРеальнойКолонки;

КонецПроцедуры

&НаСервереБезКонтекста
Функция ФорматироватьТекстЗапросаНаСервере(ТекстЗапроса)
	Перем НомерСтроки, НомерКолонки;

	СхемаЗапроса = Новый СхемаЗапроса;

	Попытка
		СхемаЗапроса.УстановитьТекстЗапроса(ТекстЗапроса);
	Исключение

		СтрокаОшибки = ОписаниеОшибки();
		РазобратьОшибкуЗапроса(СтрокаОшибки, НомерСтроки, НомерКолонки);
		Возврат Новый Структура("ОписаниеОшибки, Строка, Колонка", СтрокаОшибки, НомерСтроки, НомерКолонки);

	КонецПопытки;

	Возврат СхемаЗапроса.ПолучитьТекстЗапроса();

КонецФункции

&НаСервереБезКонтекста
Функция ПолучитьСписокФайловНаСервереВоВременных(Маска)

	маФайлыЗапросов = НайтиФайлы(КаталогВременныхФайлов(), Маска);

	маИменаФайлов = Новый Массив;
	Для Каждого Файл Из маФайлыЗапросов Цикл
		маИменаФайлов.Добавить(Файл.ПолноеИмя);
	КонецЦикла;

	Возврат маИменаФайлов;

КонецФункции

&НаСервереБезКонтекста
Процедура УдалитьФайлыНаСервере(маФайлы)
	Для Каждого ИмяФайла Из маФайлы Цикл
		УдалитьФайлы(ИмяФайла);
	КонецЦикла;
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция НужнаКнопкаВыбораЗначению(Значение)

	маТипыБезКнопкиВыбора = Новый Массив;
	маТипыБезКнопкиВыбора.Добавить(Тип("Строка"));
	маТипыБезКнопкиВыбора.Добавить(Тип("Число"));
	маТипыБезКнопкиВыбора.Добавить(Тип("Булево"));
	маТипыБезКнопкиВыбора.Добавить(Тип("ВидДвиженияНакопления"));
	маТипыБезКнопкиВыбора.Добавить(Тип("ВидДвиженияБухгалтерии"));
	маТипыБезКнопкиВыбора.Добавить(Тип("ВидСчета"));
	ТипыБезКнопкийВыбора = Новый ОписаниеТипов(маТипыБезКнопкиВыбора);

	Возврат Не ТипыБезКнопкийВыбора.СодержитТип(ТипЗнч(Значение));

КонецФункции

&НаСервереБезКонтекста
Функция ПолучитьПредставлениеИнформацииОбОшибке(ИнформацияОбОшибке)

	Если ЗначениеЗаполнено(ИнформацияОбОшибке.ИмяМодуля) И ЗначениеЗаполнено(ИнформацияОбОшибке.НомерСтроки) Тогда
		ПредставлениеИнформацииОбОшибке = ИнформацияОбОшибке.ИмяМодуля + СтрШаблон(" строка %1",
			ИнформацияОбОшибке.НомерСтроки) + "
											  |";
	ИначеЕсли ЗначениеЗаполнено(ИнформацияОбОшибке.НомерСтроки) Тогда
		ПредставлениеИнформацииОбОшибке = СтрШаблон("Строка %1", ИнформацияОбОшибке.НомерСтроки) + "
																								   |";
	Иначе
		ПредставлениеИнформацииОбОшибке = "";
	КонецЕсли;

	ПредставлениеИнформацииОбОшибке = ПредставлениеИнформацииОбОшибке + ИнформацияОбОшибке.Описание + ":
																									  |"
		+ ИнформацияОбОшибке.ИсходнаяСтрока;

	Если ИнформацияОбОшибке.Причина <> Неопределено Тогда
		ПредставлениеИнформацииОбОшибке = ПредставлениеИнформацииОбОшибке + "
																			|"
			+ ПолучитьПредставлениеИнформацииОбОшибке(ИнформацияОбОшибке.Причина);
	КонецЕсли;

	Возврат ПредставлениеИнформацииОбОшибке;

КонецФункции

&НаСервере
Функция ПараметрыЗапросаФормаПриИзмененииСЗИзТЗ(Контейнер)

	Обработка = РеквизитФормыВЗначение("Объект");

	тзТаблица = Обработка.Контейнер_ВосстановитьЗначение(Контейнер);
	сзСписок = Новый СписокЗначений;
	Если тзТаблица.Колонки.Количество() > 0 Тогда
		сзСписок.ЗагрузитьЗначения(тзТаблица.ВыгрузитьКолонку(0));
	КонецЕсли;

	Возврат Обработка.Контейнер_СохранитьЗначение(сзСписок);

КонецФункции

&НаСервереБезКонтекста
Функция ТекмтПодзапросаПоискаМоментов(ИмяМетаданныхДляЗапроса, ИмяРегистра, ИмяКолонки, ИмяПромежуточнойТаблицы,
	ТекстПоместить)
	Возврат СтрШаблон(
		"ВЫБРАТЬ
		|	%1%2.Период КАК Дата,
		|	%1%2.Регистратор КАК Ссылка,
		|	%1%2.МоментВремени КАК МоментВремени %4
		|ИЗ
		|	%1.%2 КАК %1%2 ВНУТРЕННЕЕ СОЕДИНЕНИЕ %5_ДанныеМоментов_%3 ПО %1%2.Регистратор = %5_ДанныеМоментов_%3.Ссылка И %1%2.Период = %5_ДанныеМоментов_%3.Дата
		|", ИмяМетаданныхДляЗапроса, ИмяРегистра, ИмяКолонки, ТекстПоместить, ИмяПромежуточнойТаблицы);

КонецФункции

&НаСервере
Процедура ПодготовитьВыборкуКолонокСТипомМоментВремени(тзДанные, ИмяПромежуточнойТаблицы, стНовыеВыраженияПолей,
	ДополнительныеИсточники, ДополнительныеЗапросы)
	
	//Обработка = РеквизитФормыВЗначение("Объект");

	маИменаКолонокМоментов = Новый Массив;
	//маИменаТаблицМоментовПоля = Новый Массив;
	маИменаКолонокДата = Новый Массив;
	маИменаКолонокСсылка = Новый Массив;
	маЗапросыДляПоискаМоментов = Новый Массив;

	Для Каждого Колонка Из тзДанные.Колонки Цикл

		Если Колонка.ТипЗначения.СодержитТип(Тип("МоментВремени")) Тогда

			ИмяКолонки = Колонка.Имя;
			ИмяКолонкиДата = ИмяКолонки + "_Дата31415926";
			ИмяКолонкиСсылка = ИмяКолонки + "_Ссылка31415926";
			ИмяКолонкиВременной = ИмяКолонки + "_Вр31415926";

			маИменаКолонокМоментов.Добавить(ИмяКолонки);
			маИменаКолонокДата.Добавить(ИмяКолонкиДата);
			маИменаКолонокСсылка.Добавить(ИмяКолонкиСсылка);

			маВычитаемыеТипы = Новый Массив;
			маВычитаемыеТипы.Добавить(Тип("МоментВремени"));
			маДобавляемыеТипы = Новый Массив;
			маДобавляемыеТипы.Добавить(Тип("Null"));
			ТипБезТипаМомент = Новый ОписаниеТипов(Колонка.ТипЗначения, маДобавляемыеТипы, маВычитаемыеТипы);
			ТолькоМомент = ТипБезТипаМомент = Новый ОписаниеТипов("Null");//Значит, что в колонке был только момент времени.
			                                                               //Вообще, так должно быть всегда. Не представляю ситуации, когда в колонке с моментом времени может быть что-то еще.

			тзДанные.Колонки.Добавить(ИмяКолонкиДата, Новый ОписаниеТипов("Дата", , ,
				Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя)));
			тзДанные.Колонки.Добавить(ИмяКолонкиСсылка, Документы.ТипВсеСсылки());

			Если Не ТолькоМомент Тогда
				тзДанные.Колонки.Добавить(ИмяКолонкиВременной, ТипБезТипаМомент);
			КонецЕсли;

			маТипыСсылокМоментов = Новый Массив;

			Если ТолькоМомент Тогда

				Для Каждого СтрокаДанных Из тзДанные Цикл
					Значение = СтрокаДанных[ИмяКолонки];
					СтрокаДанных[ИмяКолонкиДата] = Значение.Дата;
					СтрокаДанных[ИмяКолонкиСсылка] = Значение.Ссылка;
					маТипыСсылокМоментов.Добавить(ТипЗнч(Значение.Ссылка));
				КонецЦикла;

			Иначе

				Для Каждого СтрокаДанных Из тзДанные Цикл
					Значение = СтрокаДанных[ИмяКолонки];
					Если ТипЗнч(Значение) = Тип("МоментВремени") Тогда
						СтрокаДанных[ИмяКолонкиВременной] = Null;
						СтрокаДанных[ИмяКолонкиДата] = Значение.Дата;
						СтрокаДанных[ИмяКолонкиСсылка] = Значение.Ссылка;
						маТипыСсылокМоментов.Добавить(ТипЗнч(Значение.Ссылка));
					Иначе
						СтрокаДанных[ИмяКолонкиВременной] = Значение;
					КонецЕсли;
				КонецЦикла;

			КонецЕсли;

			тзДанные.Колонки.Удалить(ИмяКолонки);
			Если Не ТолькоМомент Тогда
				тзДанные.Колонки[ИмяКолонкиВременной].Имя = ИмяКолонки;
			КонецЕсли;

			ИмяТаблицыМоментовПоля = ИмяПромежуточнойТаблицы + "_ТаблицаМоментов_" + ИмяКолонки;
			ТекстПоместить = "ПОМЕСТИТЬ " + ИмяТаблицыМоментовПоля;

			Если ТолькоМомент Тогда
				стНовыеВыраженияПолей.Вставить(ИмяКолонки, СтрШаблон("%1.МоментВремени КАК %2", ИмяТаблицыМоментовПоля,
					ИмяКолонки));
			Иначе
				стНовыеВыраженияПолей.Вставить(ИмяКолонки, СтрШаблон("ISNULL(Таблица.%1, %2.МоментВремени) КАК %3",
					ИмяКолонки, ИмяТаблицыМоментовПоля, ИмяКолонки));
			КонецЕсли;

			ДополнительныеИсточники = ДополнительныеИсточники + СтрШаблон(
				" ЛЕВОЕ СОЕДИНЕНИЕ %1 КАК %1 ПО Таблица.%2 = %1.Дата И Таблица.%3 = %1.Ссылка", ИмяТаблицыМоментовПоля,
				ИмяКолонкиДата, ИмяКолонкиСсылка);

			маПодЗапросыДляПоискаМоментов = Новый Массив;

			маМетаданныеДляПоискаМомента = Новый Массив;
			маМетаданныеДляПоискаМомента.Добавить(Метаданные.РегистрыНакопления);
			маМетаданныеДляПоискаМомента.Добавить(Метаданные.РегистрыБухгалтерии);

			ТипыСсылокМоментов = Новый ОписаниеТипов(маТипыСсылокМоментов);
			маТипыСсылокМоментов = ТипыСсылокМоментов.Типы();

			Для Каждого Регистры Из маМетаданныеДляПоискаМомента Цикл

				Если Регистры = Метаданные.РегистрыНакопления Тогда
					ИмяМетаданныхДляЗапроса = "РегистрНакопления";
				ИначеЕсли Регистры = Метаданные.РегистрыБухгалтерии Тогда
					ИмяМетаданныхДляЗапроса = "РегистрБухгалтерии";
				Иначе
					ИмяМетаданныхДляЗапроса = "?E001?";
				КонецЕсли;

				Для Каждого Регистр Из Регистры Цикл

					ТипРегистратора = Регистр.СтандартныеРеквизиты.Регистратор.Тип;
					Для Каждого ТипСсылки Из маТипыСсылокМоментов Цикл

						Если ТипРегистратора.СодержитТип(ТипСсылки) Тогда

							маПодЗапросыДляПоискаМоментов.Добавить(ТекмтПодзапросаПоискаМоментов(
								ИмяМетаданныхДляЗапроса, Регистр.Имя, ИмяКолонки, ИмяПромежуточнойТаблицы,
								ТекстПоместить));
							ТекстПоместить = "";
							Прервать;

						КонецЕсли;

					КонецЦикла;

				КонецЦикла;

			КонецЦикла;

			Если маПодЗапросыДляПоискаМоментов.Количество() = 0 Тогда
				маПодЗапросыДляПоискаМоментов.Добавить(ТекмтПодзапросаПоискаМоментов(
					ИмяМетаданныхДляЗапроса, Регистр.Имя, ИмяКолонки, ИмяПромежуточнойТаблицы, ТекстПоместить));
			КонецЕсли;

			ТекстЗапросаПоискаМоментов = СтрСоединить(маПодЗапросыДляПоискаМоментов, "
																					 |ОБЪЕДИНИТЬ
																					 |");

			Если ЗначениеЗаполнено(ТекстЗапросаПоискаМоментов) Тогда
				маЗапросыДляПоискаМоментов.Добавить(ТекстЗапросаПоискаМоментов);
			КонецЕсли;

		КонецЕсли;

	КонецЦикла;

	Если маИменаКолонокДата.Количество() > 0 Тогда

		ТекстыЗапросовПоискаМоментов = СтрСоединить(маЗапросыДляПоискаМоментов, ";
																				|");

		маЗапросыДанныхМоментов = Новый Массив;

		Для й = 0 По маИменаКолонокДата.ВГраница() Цикл
			маЗапросыДанныхМоментов.Добавить(СтрШаблон(
				"ВЫБРАТЬ
				|	Таблица.%1 КАК Дата,
				|	Таблица.%2 КАК Ссылка
				|ПОМЕСТИТЬ %4_ДанныеМоментов_%3
				|ИЗ
				|	%4 КАК Таблица", маИменаКолонокДата[й], маИменаКолонокСсылка[й], маИменаКолонокМоментов[й],
				ИмяПромежуточнойТаблицы));
		КонецЦикла;

		ТекстЗапросаДанныхМоментов = СтрСоединить(маЗапросыДанныхМоментов, ";
																		   |
																		   |");

		ДополнительныеЗапросы = ТекстЗапросаДанныхМоментов + "; 
															 |
															 |" + ТекстыЗапросовПоискаМоментов;

	КонецЕсли;

КонецПроцедуры

&НаСервере
Процедура ПодготовитьВыборкуКолонокСТипомТип(тзДанные, ИмяПромежуточнойТаблицы, стНовыеВыраженияПолей,
	ДополнительныеИсточники, ДополнительныеЗапросы)

	Обработка = РеквизитФормыВЗначение("Объект");

	Для Каждого Колонка Из тзДанные.Колонки Цикл

		Если Колонка.ТипЗначения.СодержитТип(Тип("Тип")) Тогда

			ИмяКолонки = Колонка.Имя;
			ИмяКолонкиТип = ИмяКолонки + "_Тип31415926";
			ИмяКолонкиВременной = ИмяКолонки + "_Вр31415926";

			маВычитаемыеТипы = Новый Массив;
			маВычитаемыеТипы.Добавить(Тип("Тип"));
			маДобавляемыеТипы = Новый Массив;
			маДобавляемыеТипы.Добавить(Тип("Null"));
			ТипБезТипаТип = Новый ОписаниеТипов(Колонка.ТипЗначения, маДобавляемыеТипы, маВычитаемыеТипы);
			ТолькоТип = ТипБезТипаТип = Новый ОписаниеТипов("Null");//Значит, что в колонке был только тип.
			                                                         //Вообще, так должно быть всегда. Не представляю ситуации, когда в колонке с типом может быть что-то еще.

			тзДанные.Колонки.Добавить(ИмяКолонкиТип);
			Если Не ТолькоТип Тогда
				тзДанные.Колонки.Добавить(ИмяКолонкиВременной, ТипБезТипаТип);
			КонецЕсли;

			маТипы = Новый Массив;

			Если ТолькоТип Тогда

				Для Каждого СтрокаДанных Из тзДанные Цикл
					маТипы.Добавить(СтрокаДанных[ИмяКолонки]);
					ОписаниеТипа = ОписаниеТиповПоТипу(СтрокаДанных[ИмяКолонки]);
					Значение = ОписаниеТипа.ПривестиЗначение(Неопределено);
					СтрокаДанных[ИмяКолонкиТип] = Значение;
				КонецЦикла;

			Иначе

				Для Каждого СтрокаДанных Из тзДанные Цикл
					Если ТипЗнч(СтрокаДанных[ИмяКолонки]) = Тип("Тип") Тогда
						маТипы.Добавить(СтрокаДанных[ИмяКолонки]);
						ОписаниеТипа = ОписаниеТиповПоТипу(СтрокаДанных[ИмяКолонки]);
						Значение = ОписаниеТипа.ПривестиЗначение(Неопределено);
						СтрокаДанных[ИмяКолонкиТип] = Значение;
						СтрокаДанных[ИмяКолонкиВременной] = Null;
					Иначе
						СтрокаДанных[ИмяКолонкиВременной] = СтрокаДанных[ИмяКолонки];
					КонецЕсли;
				КонецЦикла;

			КонецЕсли;

			тзДанные.Колонки.Удалить(ИмяКолонки);
			Если Не ТолькоТип Тогда
				тзДанные.Колонки[ИмяКолонкиВременной].Имя = ИмяКолонки;
			КонецЕсли;

			ТипКолонкиТипа = Новый ОписаниеТипов(маТипы);
			Обработка.ИзменитьТипКолонкиТаблицыЗначений(тзДанные, ИмяКолонкиТип, ТипКолонкиТипа);
			
			//стВыраженияПолей.Вставить(стВыраженияПолей

			Если ТолькоТип Тогда
				стНовыеВыраженияПолей.Вставить(ИмяКолонки, "ТИПЗНАЧЕНИЯ(Таблица." + ИмяКолонкиТип + ") КАК "
					+ ИмяКолонки);
			Иначе
				стНовыеВыраженияПолей.Вставить(ИмяКолонки, "ISNULL(Таблица." + ИмяКолонки + ", ТИПЗНАЧЕНИЯ(Таблица."
					+ ИмяКолонкиТип + ")) КАК " + ИмяКолонки);
			КонецЕсли;

		КонецЕсли;

	КонецЦикла;

КонецПроцедуры

&НаСервере
Процедура УстановитьТипКолонокБезТипа(тзДанные)

	Обработка = РеквизитФормыВЗначение("Объект");
	ПустойТип = Новый ОписаниеТипов;
	маНеЗначащиеТипы = Новый Массив;
	маНеЗначащиеТипы.Добавить("Неопределено");
	маНеЗначащиеТипы.Добавить("Null");

	маОбрабатываемыеКолонки = Новый Массив;
	маТипыКолонок = Новый Массив;
	Для Каждого Колонка Из тзДанные.Колонки Цикл
		//маТипы = Колонка.ТипЗначения.Типы();
		Если Колонка.ТипЗначения = ПустойТип Тогда
			маОбрабатываемыеКолонки.Добавить(Колонка.Имя);
			маТипыКолонок.Добавить(Новый Массив);
		КонецЕсли;
	КонецЦикла;

	Если маОбрабатываемыеКолонки.Количество() > 0 Тогда

		Для Каждого Строка Из тзДанные Цикл
			Для й = 0 По маОбрабатываемыеКолонки.Количество() - 1 Цикл
				ИмяКолонки = маОбрабатываемыеКолонки[й];
				маТипыКолонок[й].Добавить(ТипЗнч(Строка[ИмяКолонки]));
			КонецЦикла;
		КонецЦикла;

		Для й = 0 По маОбрабатываемыеКолонки.Количество() - 1 Цикл

			ИмяКолонки = маОбрабатываемыеКолонки[й];
			//ИмяВременнойКолонки = ИмяКолонки + "_Вр31415926";

			СтарыйТипЗначения = тзДанные.Колонки[ИмяКолонки].ТипЗначения;
			НовыйТипКолонки = Новый ОписаниеТипов(маТипыКолонок[й], СтарыйТипЗначения.КвалификаторыЧисла,
				СтарыйТипЗначения.КвалификаторыСтроки, СтарыйТипЗначения.КвалификаторыДаты,
				СтарыйТипЗначения.КвалификаторыДвоичныхДанных);

			ЗначимыеТипы = Новый ОписаниеТипов(НовыйТипКолонки, , маНеЗначащиеТипы);
			Если ЗначимыеТипы = ПустойТип Тогда
				НовыйТипКолонки = Новый ОписаниеТипов(НовыйТипКолонки, "Число");//нужно поставить хоть какой-то тип, иначе в запросе не загрузить...
				//Сообщить(Строка(ИмяКолонки) + " - тип колонки не определен, установлено число.");//отладка
			КонецЕсли;

			Обработка.ИзменитьТипКолонкиТаблицыЗначений(тзДанные, ИмяКолонки, НовыйТипКолонки);

		КонецЦикла;

	КонецЕсли;

КонецПроцедуры

&НаСервере
Процедура ЗагрузитьВременнуюТаблицу(ИмяТаблицы, тзДанные, маЗапросыЗагрузки, ЗапросЗагрузкиТаблиц)

	УстановитьТипКолонокБезТипа(тзДанные);

	маПоляТаблицы = Новый Массив;
	Для Каждого Колонка Из тзДанные.Колонки Цикл
		маПоляТаблицы.Добавить(Колонка.Имя);
	КонецЦикла;

	стНовыеВыраженияПолей = Новый Структура;
	ДополнительныеИсточники = "";
	ДополнительныеЗапросы = "";
	ИмяПромежуточнойТаблицы = ИмяТаблицы + "_Вр31415926";
	ПодготовитьВыборкуКолонокСТипомТип(тзДанные, ИмяПромежуточнойТаблицы, стНовыеВыраженияПолей,
		ДополнительныеИсточники, ДополнительныеЗапросы);
	ПодготовитьВыборкуКолонокСТипомМоментВремени(тзДанные, ИмяПромежуточнойТаблицы, стНовыеВыраженияПолей,
		ДополнительныеИсточники, ДополнительныеЗапросы);
	Если стНовыеВыраженияПолей.Количество() > 0 Тогда

		маВыраженияПолей = Новый Массив;
		Для Каждого Колонка Из тзДанные.Колонки Цикл
			Выражение = "Таблица." + Колонка.Имя + " КАК " + Колонка.Имя;
			маВыраженияПолей.Добавить(Выражение);
		КонецЦикла;
		ВыраженияПолей = СтрСоединить(маВыраженияПолей, ",
														|");

		маЗапросыЗагрузки.Добавить("
								   |ВЫБРАТЬ
								   |" + ВыраженияПолей + "
														 |ПОМЕСТИТЬ " + ИмяПромежуточнойТаблицы + "
																								  |ИЗ &" + ИмяТаблицы
			+ " КАК Таблица");

		Если ЗначениеЗаполнено(ДополнительныеЗапросы) Тогда
			маЗапросыЗагрузки.Добавить(ДополнительныеЗапросы);
		КонецЕсли;

		Источник = ИмяПромежуточнойТаблицы;

	Иначе
		Источник = "&" + ИмяТаблицы;
	КонецЕсли;

	Выражение = Неопределено;
	маВыраженияПолей = Новый Массив;
	Для Каждого ИмяКолонки Из маПоляТаблицы Цикл
		Если Не стНовыеВыраженияПолей.Свойство(ИмяКолонки, Выражение) Тогда
			Выражение = "Таблица." + ИмяКолонки + " КАК " + ИмяКолонки;
		КонецЕсли;
		маВыраженияПолей.Добавить(Выражение);
	КонецЦикла;
	ВыраженияПолей = СтрСоединить(маВыраженияПолей, ",
													|");

	маЗапросыЗагрузки.Добавить("
							   |ВЫБРАТЬ
							   |" + ВыраженияПолей + "
													 |ПОМЕСТИТЬ " + ИмяТаблицы + "
																				 |ИЗ " + Источник + " КАК Таблица"
		+ " " + ДополнительныеИсточники);

	ЗапросЗагрузкиТаблиц.УстановитьПараметр(ИмяТаблицы, тзДанные);

КонецПроцедуры

&НаСервере
Функция ЗагрузитьВременныеТаблицы()

	Если ВременныеТаблицы.Количество() = 0 Тогда
		Возврат Новый МенеджерВременныхТаблиц;
	КонецЕсли;

	ЗапросЗагрузкиТаблиц = Новый Запрос;
	ЗапросЗагрузкиТаблиц.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;

	маЗапросыЗагрузки = Новый Массив;
	Для Каждого СтрокаВременнаяТаблица Из ВременныеТаблицы Цикл

		ИмяТаблицы = СтрокаВременнаяТаблица.Имя;
		тзДанные = РеквизитФормыВЗначение("Объект").Контейнер_ВосстановитьЗначение(СтрокаВременнаяТаблица.Контейнер);
		ЗагрузитьВременнуюТаблицу(ИмяТаблицы, тзДанные, маЗапросыЗагрузки, ЗапросЗагрузкиТаблиц);

	КонецЦикла;

	ЗапросЗагрузкиТаблиц.Текст = СтрСоединить(маЗапросыЗагрузки, ";
																 |");

	ЗапросЗагрузкиТаблиц.Выполнить();

	Возврат ЗапросЗагрузкиТаблиц.МенеджерВременныхТаблиц;

КонецФункции

&НаСервере
Процедура ВыборкуВДерево(выбВыборка, Узел, й, фЕстьКонтейнеры, Обработка, фЕстьМакроколонки, стМакроколонки)

	ЭлементыУзла = Узел.ПолучитьЭлементы();

	Пока выбВыборка.Следующий() Цикл

		й = й + 1;

		Если ОграничениеВыводимыхСтрок > 0 И й > ОграничениеВыводимыхСтрок Тогда
			Прервать;
		КонецЕсли;

		РезультатЗапросаСтрока = ЭлементыУзла.Добавить();
		ЗаполнитьЗначенияСвойств(РезультатЗапросаСтрока, выбВыборка);

		Если фЕстьКонтейнеры Тогда
			Обработка.ДобавитьКонтейнеры(РезультатЗапросаСтрока, выбВыборка, РезультатЗапросаКолонкиКонтейнера);
		КонецЕсли;

		Если фЕстьМакроколонки Тогда
			Обработка.ОбработатьМакроколонки(РезультатЗапросаСтрока, выбВыборка, стМакроколонки);
		КонецЕсли;

		выбПодчиненные = выбВыборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
		Если выбПодчиненные.Количество() > 0 Тогда
			ВыборкуВДерево(выбПодчиненные, РезультатЗапросаСтрока, й, фЕстьКонтейнеры, Обработка, фЕстьМакроколонки,
				стМакроколонки);
		КонецЕсли;

	КонецЦикла;

КонецПроцедуры

&НаСервере
Функция ИзвлечьРезультатКакТаблицуЗначений()

	Обработка = РеквизитФормыВЗначение("Объект");

	стРезультатЗапроса = ПолучитьИзВременногоХранилища(АдресРезультатаЗапроса);
	маРезультатЗапроса = стРезультатЗапроса.Результат;
	стРезультатПакета = маРезультатЗапроса[Число(РезультатВПакете) - 1];
	рзВыборка = стРезультатПакета.Результат;
	стМакроколонки = стРезультатПакета.Макроколонки;
	фЕстьМакроколонки = стМакроколонки.Количество() > 0;

	Если фЕстьМакроколонки Тогда

		тзРезультат = Новый ТаблицаЗначений;

		Для Каждого Колонка Из рзВыборка.Колонки Цикл
			тзРезультат.Колонки.Добавить(Колонка.Имя, Колонка.ТипЗначения);
		КонецЦикла;

		выбВыборка = рзВыборка.Выбрать();
		Пока выбВыборка.Следующий() Цикл
			Строка = тзРезультат.Добавить();
			ЗаполнитьЗначенияСвойств(Строка, выбВыборка);
			Обработка.ОбработатьМакроколонки(Строка, выбВыборка, стМакроколонки);
		КонецЦикла;

	Иначе
		тзРезультат = рзВыборка.Выгрузить();
	КонецЕсли;

	Возврат тзРезультат;

КонецФункции

&НаСервере
Функция ИзвлечьРезультатКакКонтейнер(фУдалитьТипNull = Истина)

	Обработка = РеквизитФормыВЗначение("Объект");

	тз = ИзвлечьРезультатКакТаблицуЗначений();
	Обработка.ТаблицаЗначений_УдалитьТипNull(тз);

	Возврат Обработка.Контейнер_СохранитьЗначение(тз);

КонецФункции

&НаСервере
Процедура СтруктураЗаписиРезультата_РаскрытьПодчиненныеУзлы(Строка)
	Перем Картинки;

	Обработка = РеквизитФормыВЗначение("Объект");

	СтрокаДерева = СтруктураЗаписиРезультата.НайтиПоИдентификатору(Строка);

	Для Каждого ЭлементСтруктуры Из СтрокаДерева.ПолучитьЭлементы() Цикл

		Если ТипЗнч(ЭлементСтруктуры.Тип) = Тип("ОписаниеТипов") Тогда

			соСчетчики = Новый Соответствие;
			соТипы = Новый Соответствие;

			ТипыБезПустых = Обработка.ТипБезПустых(ЭлементСтруктуры.Тип);
			маТипы = ТипыБезПустых.Типы();
			Для Каждого Тип Из маТипы Цикл

				МетаданныеЭлемента = Неопределено;
				Если Справочники.ТипВсеСсылки().СодержитТип(Тип) Или Документы.ТипВсеСсылки().СодержитТип(Тип)
					Или ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(Тип)
					Или ПланыСчетов.ТипВсеСсылки().СодержитТип(Тип) Или ПланыВидовРасчета.ТипВсеСсылки().СодержитТип(Тип)
					Или БизнесПроцессы.ТипВсеСсылки().СодержитТип(Тип) Или Задачи.ТипВсеСсылки().СодержитТип(Тип)
					Или ПланыОбмена.ТипВсеСсылки().СодержитТип(Тип) Тогда
					МетаданныеЭлемента = ОписаниеТиповПоТипу(Тип).ПривестиЗначение(Неопределено).Метаданные();
				КонецЕсли;

				Если МетаданныеЭлемента <> Неопределено Тогда

					маКоллекцииРеквизитов = Новый Массив;
					маКоллекцииРеквизитов.Добавить(МетаданныеЭлемента.СтандартныеРеквизиты);
					маКоллекцииРеквизитов.Добавить(МетаданныеЭлемента.Реквизиты);

					Для Каждого КоллекцияРеквизитов Из маКоллекцииРеквизитов Цикл
						Для Каждого Реквизит Из КоллекцияРеквизитов Цикл

							К = соСчетчики[Реквизит.Имя];
							К = ?(К = Неопределено, 0, К);
							соСчетчики[Реквизит.Имя] = К + 1;

							Типы = соТипы[Реквизит.Имя];
							Если Типы = Неопределено Тогда
								Типы = Новый Массив;
							КонецЕсли;

							Для Каждого Тип Из Реквизит.Тип.Типы() Цикл
								Типы.Добавить(Тип);
							КонецЦикла;

							соТипы[Реквизит.Имя] = Типы;

						КонецЦикла;
					КонецЦикла;

				КонецЕсли;

			КонецЦикла;

			Для Каждого кз Из соСчетчики Цикл

				Если кз.Значение = маТипы.Количество() Тогда//Добавляем только те реквизиты, которые есть во всех типах составного типа.

					стрИмя = кз.Ключ;
					маТипы = соТипы[стрИмя];
					НовыйЭлементСтруктуры = ЭлементСтруктуры.ПолучитьЭлементы().Добавить();
					НовыйЭлементСтруктуры.Имя = стрИмя;
					НовыйЭлементСтруктуры.Тип = Новый ОписаниеТипов(маТипы);

					НовыйЭлементСтруктуры.Картинка = Обработка.ПолучитьКартинкуПоТипу(НовыйЭлементСтруктуры.Тип,
						Картинки);

				КонецЕсли;

			КонецЦикла;

		КонецЕсли;

	КонецЦикла;

	СтрокаДерева.ПодчиненныеУзлыРаскрыты = Истина;

КонецПроцедуры

&НаКлиенте
Процедура СтруктураЗаписиРезультата_Развернуть()
	//ЭлементыДерева = СтруктураЗаписиРезультата.ПолучитьЭлементы();
	//Для Каждого ТекЭлемент ИЗ ЭлементыДерева Цикл
		//Элементы.СтруктураЗаписиРезультата.Развернуть(ТекЭлемент.ПолучитьИдентификатор());
	//КонецЦикла;
	
	#Область УИ_ПослеОбновленияСтруктурыЗаписиРезультата
	
	УИ_ДобавитьКонтекстСтруктурыРезультатаАлгоритм();
	#КонецОбласти
КонецПроцедуры

&НаСервере
//Заполняет структуру записи, используемую на странице выполнения кода.
Процедура СтруктураЗаписиРезультата_ЗаполнитьСтруктуруЗаписи(рзВыборка = Неопределено)
	Перем Картинки;

	СтруктураЗаписиРезультата.ПолучитьЭлементы().Очистить();

	Если рзВыборка = Неопределено Тогда
		Возврат;
	КонецЕсли;

	Обработка = РеквизитФормыВЗначение("Объект");
	
	//Свойства в выборке раскрывать не нужно. Все необходимое нужно выбирать в запросе.
	фРаскрыватьСвойстваВВыборке = Ложь;
	
	//А в параметрах раскроем, это не так страшно.
	фРаскрыватьСвойстваВПараметрах = Истина;

	ЭлементСтруктурыВыборка = СтруктураЗаписиРезультата.ПолучитьЭлементы().Добавить();
	ЭлементСтруктурыВыборка.Имя = "Выборка";
	ЭлементСтруктурыВыборка.ПодчиненныеУзлыРаскрыты = Не фРаскрыватьСвойстваВВыборке;

	Для Каждого Колонка Из рзВыборка.Колонки Цикл
		ЭлементСтруктуры = ЭлементСтруктурыВыборка.ПолучитьЭлементы().Добавить();
		ЭлементСтруктуры.Имя = Колонка.Имя;
		ЭлементСтруктуры.Тип = Колонка.ТипЗначения;
		ЭлементСтруктуры.Картинка = Обработка.ПолучитьКартинкуПоТипу(Обработка.ТипБезПустых(Колонка.ТипЗначения),
			Картинки);
		ЭлементСтруктуры.ПодчиненныеУзлыРаскрыты = Не фРаскрыватьСвойстваВВыборке;
	КонецЦикла;

	ЭлементСтруктурыПараметры = СтруктураЗаписиРезультата.ПолучитьЭлементы().Добавить();
	ЭлементСтруктурыПараметры.Имя = "Параметры";
	ЭлементСтруктурыПараметры.ПодчиненныеУзлыРаскрыты = Не фРаскрыватьСвойстваВПараметрах;

	Для Каждого СтрокаПараметра Из ПараметрыЗапроса Цикл

		ЭлементСтруктуры = ЭлементСтруктурыПараметры.ПолучитьЭлементы().Добавить();
		ЭлементСтруктуры.Имя = СтрокаПараметра.Имя;

		Если СтрокаПараметра.ТипКонтейнера = 1 Тогда
			ТипЗначения = Новый ОписаниеТипов("СписокЗначений");
		ИначеЕсли СтрокаПараметра.ТипКонтейнера = 2 Тогда
			ТипЗначения = Новый ОписаниеТипов("Массив");
		Иначе
			ТипЗначения = СтрокаПараметра.ТипЗначения;
		КонецЕсли;

		ЭлементСтруктуры.Тип = ТипЗначения;
		ЭлементСтруктуры.Картинка = Обработка.ПолучитьКартинкуПоТипу(Обработка.ТипБезПустых(ТипЗначения), Картинки);
		ЭлементСтруктуры.ПодчиненныеУзлыРаскрыты = Не фРаскрыватьСвойстваВПараметрах;

	КонецЦикла;

КонецПроцедуры

&НаСервере
Функция ИзвлечьРезультат(чРезультат = Неопределено)

	Если чРезультат = РезультатНаФорме Тогда
		Возврат 0;
	КонецЕсли;

	Если чРезультат <> Неопределено Тогда
		РезультатНаФорме = чРезультат;
	КонецЕсли;

	КоличествоЗаписейРезультата = ИзвлечьРезультатВДанныеФормы(РезультатНаФорме);

	РезультатВПакете = РезультатНаФорме;

	Элементы.ПакетРезультатаЗапроса.ТекущаяСтрока = ПакетРезультатаЗапроса[РезультатНаФорме - 1].ПолучитьИдентификатор();

	Для Каждого Строка Из ПакетРезультатаЗапроса Цикл
		Строка.ТекущийОтображаемый = Ложь;
	КонецЦикла;
	ПакетРезультатаЗапроса[РезультатНаФорме - 1].ТекущийОтображаемый = Истина;

	Возврат КоличествоЗаписейРезультата;

КонецФункции

&НаСервере
Функция ИзвлечьРезультатВДанныеФормы(РезультатВПакете)

	Обработка = РеквизитФормыВЗначение("Объект");

	фДерево = ВидРезультата = "дерево";
	Если фДерево Тогда
		ИмяРеквизитаРезультата = "РезультатЗапросаДерево";
	Иначе
		ИмяРеквизитаРезультата = "РезультатЗапроса";
	КонецЕсли;

	Элементы.ОбновитьРезультат.Доступность = Истина;
	Элементы.РезультатЗапроса.Видимость = Не фДерево;
	Элементы.КоманднаяПанельРезультата.Видимость = Не фДерево;
	Элементы.КоманднаяПанельРезультата.Доступность = Не фДерево;
	Элементы.РезультатЗапросаДерево.Видимость = фДерево;
	Элементы.КоманднаяПанельРезультатаДерево.Видимость = фДерево;
	Элементы.КоманднаяПанельРезультатаДеревоЛево.Видимость = фДерево;

	Если Не ЗначениеЗаполнено(АдресРезультатаЗапроса) Тогда
		СтруктураЗаписиРезультата_ЗаполнитьСтруктуруЗаписи();
		Возврат 0;
	КонецЕсли;

	Если Число(РезультатВПакете) <= 0 Тогда
		РеквизитФормыВЗначение("Объект").СоздатьРеквизитыТаблицыПоКолонкам(ЭтаФорма, ИмяРеквизитаРезультата,
			"РезультатЗапросаСоответствиеКолонок", "РезультатЗапросаКолонкиКонтейнера", Неопределено);
		СтруктураЗаписиРезультата_ЗаполнитьСтруктуруЗаписи();
		Возврат 0;
	КонецЕсли;

	Элементы.ГруппаУправлениеРезультатомЗапроса.Доступность = Истина;

	стРезультатЗапроса = ПолучитьИзВременногоХранилища(АдресРезультатаЗапроса);
	маРезультатЗапроса = стРезультатЗапроса.Результат;
	стРезультат = маРезультатЗапроса[Число(РезультатВПакете) - 1];
	рзВыборка = стРезультат.Результат;
	стМакроколонки = стРезультат.Макроколонки;
	ЕстьМакроколонки = стМакроколонки.Количество() > 0;

	РезультатЗапроса.Очистить();
	РезультатЗапросаДерево.ПолучитьЭлементы().Очистить();
	Обработка.СоздатьРеквизитыТаблицыПоКолонкам(ЭтаФорма, ИмяРеквизитаРезультата,
		"РезультатЗапросаСоответствиеКолонок", "РезультатЗапросаКолонкиКонтейнера", ?(рзВыборка = Неопределено,
		Неопределено, рзВыборка.Колонки), Ложь, стМакроколонки);

	Если рзВыборка = Неопределено Тогда
		СтруктураЗаписиРезультата_ЗаполнитьСтруктуруЗаписи();
		Возврат 0;
	КонецЕсли;

	маСписокКолонок = Новый Массив;
	Для Каждого кзКолонка Из РезультатЗапросаСоответствиеКолонок Цикл
		маСписокКолонок.Добавить(кзКолонка.Значение);
	КонецЦикла;
	СписокКолонокСтрокой = СтрСоединить(маСписокКолонок, ",");

	ЕстьКонтейнеры = РезультатЗапросаКолонкиКонтейнера.Количество() > 0;
	Если Не ЕстьМакроколонки И Не ЕстьКонтейнеры И (Не ОграничениеВыводимыхСтрокВкл Или ОграничениеВыводимыхСтрок = 0) Тогда

		Если фДерево Тогда

			тзРезультат = рзВыборка.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);
			ЗначениеВДанныеФормы(тзРезультат, РезультатЗапросаДерево);
			КоличествоВозвращенныхСтрокРезультата = рзВыборка.Выбрать().КОличество();

		Иначе

			тзРезультат = рзВыборка.Выгрузить();
			ЗначениеВДанныеФормы(тзРезультат, РезультатЗапроса);

			КоличествоВозвращенныхСтрокРезультата = тзРезультат.Количество();

			Если тзРезультат.Количество() > 0 Тогда
				тзРезультат.Свернуть("", СписокКолонокСтрокой);
				ЗаполнитьЗначенияСвойств(РезультатЗапросаИтоги[0], тзРезультат[0]);
			КонецЕсли;

		КонецЕсли;

	Иначе

		Если фДерево Тогда

			выбЗапрос = рзВыборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

			й = 0;
			ВыборкуВДерево(выбЗапрос, РезультатЗапросаДерево, й, ЕстьКонтейнеры, Обработка, ЕстьМакроколонки,
				стМакроколонки);

			КоличествоВозвращенныхСтрокРезультата = выбЗапрос.Количество();

		Иначе

			й = 0;
			выбЗапрос = рзВыборка.Выбрать();
			Пока выбЗапрос.Следующий() Цикл

				й = й + 1;

				Если ОграничениеВыводимыхСтрокВкл И ОграничениеВыводимыхСтрок > 0 И й > ОграничениеВыводимыхСтрок Тогда
					Прервать;
				КонецЕсли;

				РезультатЗапросаСтрока = РезультатЗапроса.Добавить();
				ЗаполнитьЗначенияСвойств(РезультатЗапросаСтрока, выбЗапрос);
				Если ЕстьКонтейнеры Тогда
					Обработка.ДобавитьКонтейнеры(РезультатЗапросаСтрока, выбЗапрос, РезультатЗапросаКолонкиКонтейнера);
				КонецЕсли;

				Если ЕстьМакроколонки Тогда
					Обработка.ОбработатьМакроколонки(РезультатЗапросаСтрока, выбЗапрос, стМакроколонки);
				КонецЕсли;

			КонецЦикла;

			Если ОграничениеВыводимыхСтрокВкл И ОграничениеВыводимыхСтрок > 0 Тогда
				тзРезультат = ДанныеФормыВЗначение(РезультатЗапроса, Тип("ТаблицаЗначений"));
			Иначе
				тзРезультат = рзВыборка.Выгрузить();
			КонецЕсли;

			Если тзРезультат.Количество() > 0 Тогда
				тзРезультат.Свернуть("", СписокКолонокСтрокой);
				ЗаполнитьЗначенияСвойств(РезультатЗапросаИтоги[0], тзРезультат[0]);
			КонецЕсли;

			КоличествоВозвращенныхСтрокРезультата = рзВыборка.Выбрать().Количество();

		КонецЕсли;

	КонецЕсли;

	Элементы.ПланЗапроса.Видимость = ЗначениеЗаполнено(стРезультат.ЗапросИД);

	Элементы.ПакетРезультатаЗапросаИнфо.ГиперссылкаЯчейки = Элементы.ПланЗапроса.Видимость;

	СтруктураЗаписиРезультата_ЗаполнитьСтруктуруЗаписи(рзВыборка);

	Возврат КоличествоВозвращенныхСтрокРезультата;

КонецФункции

#Область СохраняемыеСостояния

//Сохраняемые состояния - структура, предназначена для сохранения значений, которых нет в опциях (состояния флажков форм,
//разных значений, и т.д.). Записывается в файл. Из файла читается только при первом открытии.
//Это дублирование кода из модуля обработки, но если нужно получать и с сервера, и с клиента, 1С по другому не умеет. Лишний вызов сервера не нужен.

&НаКлиенте
Процедура СохраняемыеСостояния_Сохранить(ИмяЗначения, Значение) Экспорт

	Если Не ЗначениеЗаполнено(Объект.СохраняемыеСостояния) Тогда
		Объект.СохраняемыеСостояния = Новый Структура;
	КонецЕсли;

	Объект.СохраняемыеСостояния.Вставить(ИмяЗначения, Значение);

КонецПроцедуры

&НаКлиенте
Функция СохраняемыеСостояния_Получить(ИмяЗначения, ЗначениеПоУмолчанию) Экспорт
	Перем Значение;

	Если Не ЗначениеЗаполнено(Объект.СохраняемыеСостояния) Или Не Объект.СохраняемыеСостояния.Свойство(ИмяЗначения,
		Значение) Тогда
		Возврат ЗначениеПоУмолчанию;
	КонецЕсли;

	Возврат Значение;

КонецФункции

&НаСервере
Процедура СохраняемыеСостояния_СохранитьНаСервере(ИмяЗначения, Значение) Экспорт

	Если Не ЗначениеЗаполнено(Объект.СохраняемыеСостояния) Тогда
		Объект.СохраняемыеСостояния = Новый Структура;
	КонецЕсли;

	Объект.СохраняемыеСостояния.Вставить(ИмяЗначения, Значение);

КонецПроцедуры

&НаСервере
Функция СохраняемыеСостояния_ПолучитьНаСервере(ИмяЗначения, ЗначениеПоУмолчанию) Экспорт
	Перем Значение;

	Если Не ЗначениеЗаполнено(Объект.СохраняемыеСостояния) Или Не Объект.СохраняемыеСостояния.Свойство(ИмяЗначения,
		Значение) Тогда
		Возврат ЗначениеПоУмолчанию;
	КонецЕсли;

	Возврат Значение;

КонецФункции

#КонецОбласти

#Область ВыполнениеЗапроса

&НаСервере
Функция РазобратьВыражениеМакроКолонки(СтрокаМакроВыражения)

	стМакроколонка = Неопределено;

	маЪ = СтрРазделить(СтрокаМакроВыражения, "_");
	Если маЪ.Количество() > 1 Тогда

		стрТипМакро = маЪ[0];
		стрКолонкаИсточника = Прав(СтрокаМакроВыражения, СтрДлина(СтрокаМакроВыражения) - СтрДлина(стрТипМакро) - 1);

		ТипЗначения = Неопределено;
		Если стрТипМакро = "УИД" Тогда
			ТипЗначения = Новый ОписаниеТипов("УникальныйИдентификатор");
		ИначеЕсли стрТипМакро = "ДатаСоздания" Тогда
			ТипЗначения = Новый ОписаниеТипов("Дата");
		КонецЕсли;

		Если ТипЗначения <> Неопределено Тогда
			стМакроколонка = Новый Структура("Тип, ТипЗначения, КолонкаИсточника", стрТипМакро, ТипЗначения,
				стрКолонкаИсточника);
		КонецЕсли;

	КонецЕсли;

	Возврат стМакроколонка;

КонецФункции



&НаСервере
Функция ПолучитьМакроколонки(ЗапросСхемы)

	стМакроколонки = Новый Структура;
	Если Не Объект.ОпцияОбрабатывать__ Тогда
		Возврат стМакроколонки;
	КонецЕсли;

	СтрокаНачалаМакро = "&" + МакроПараметр;
	Для Каждого Колонка Из ЗапросСхемы.Колонки Цикл

		Если Колонка.Поля.Количество() > 0 Тогда

			Выражение = Колонка.Поля[0];
			Если СтрНачинаетсяС(Выражение, СтрокаНачалаМакро) Тогда

				стрМакроВыражение = Прав(Выражение, СтрДлина(Выражение) - СтрДлина(СтрокаНачалаМакро));
				стМакроколонка = РазобратьВыражениеМакроКолонки(стрМакроВыражение);
				Если стМакроколонка <> Неопределено Тогда
					стМакроколонки.Вставить(Колонка.Псевдоним, стМакроколонка);
				КонецЕсли;

			КонецЕсли;

		КонецЕсли;

	КонецЦикла;

	Возврат стМакроколонки;

КонецФункции

&НаСервере
//Выполняет запрос по схеме, извлекая информацию о каждом подзапросе пакета (тип подзапроса, имена временных таблиц, количество строк результата, и т.д.
Функция ВыполнитьПакет(Запрос, СхемаЗапроса)
	
	//Обработка = РеквизитФормыВЗначение("Объект");

	маРезультатПакета = Новый Массив;
	Для Каждого ЗапросСхемы Из СхемаЗапроса.ПакетЗапросов Цикл

		Если ТипЗнч(ЗапросСхемы) = Тип("ЗапросВыбораСхемыЗапроса") Тогда

			Если ТехнологическийЖурналВключенИРаботает Тогда
				ЗапросИД = "i" + СтрЗаменить(Новый УникальныйИдентификатор, "-", "");
				Запрос.Текст = СтрШаблон(
					"ВЫБРАТЬ ""%2_begin"" ПОМЕСТИТЬ %2_begin; %1; ВЫБРАТЬ ""%2_end"" ПОМЕСТИТЬ %2_end",
					ЗапросСхемы.ПолучитьТекстЗапроса(), ЗапросИД);
			Иначе
				ЗапросИД = Неопределено;
				Запрос.Текст = ЗапросСхемы.ПолучитьТекстЗапроса();
			КонецЕсли;

			стМакроколонки = ПолучитьМакроколонки(ЗапросСхемы);
			ВремяНачалаЗапроса = ТекущаяУниверсальнаяДатаВМиллисекундах();
			маРезультатЗапроса = Запрос.ВыполнитьПакет(); //6345bb7034de4ad1b14249d2d7ac26dd
			ВремяОкончанияЗапроса = ТекущаяУниверсальнаяДатаВМиллисекундах();
			ДлительностьВМиллисекундах = ВремяОкончанияЗапроса - ВремяНачалаЗапроса;

			Если Объект.ТехнологическийЖурналВключен Тогда
				рзРезультат = маРезультатЗапроса[1];
			Иначе
				рзРезультат = маРезультатЗапроса[0];
			КонецЕсли;

			Если ЗначениеЗаполнено(ЗапросСхемы.ТаблицаДляПомещения) Тогда

				чКоличествоЗаписей = Неопределено;
				выбРезультат = рзРезультат.Выбрать();
				Если выбРезультат.Следующий() Тогда
					чКоличествоЗаписей = выбРезультат.Количество;
				КонецЕсли;

				Запрос.Текст = "ВЫБРАТЬ * ИЗ " + ЗапросСхемы.ТаблицаДляПомещения;
				рзРезультатТаблицы = Запрос.Выполнить();
				стРезультат = Новый Структура("Результат, ИмяТаблицы, ИмяРезультата, КоличествоЗаписей, Макроколонки, ВремяНачалаЗапроса, ДлительностьВМиллисекундах, СозданиеВременнойТаблицы, ЗапросИД",
					рзРезультатТаблицы, ЗапросСхемы.ТаблицаДляПомещения, ЗапросСхемы.ТаблицаДляПомещения,
					чКоличествоЗаписей, стМакроколонки, ВремяНачалаЗапроса, ДлительностьВМиллисекундах, Истина,
					ЗапросИД);
				маРезультатПакета.Добавить(стРезультат);

			Иначе

				стРезультат = Новый Структура("Результат, ИмяТаблицы, ИмяРезультата, КоличествоЗаписей, Макроколонки, ВремяНачалаЗапроса, ДлительностьВМиллисекундах, СозданиеВременнойТаблицы, ЗапросИД",
					рзРезультат, , "Результат" + СхемаЗапроса.ПакетЗапросов.Индекс(ЗапросСхемы),
					рзРезультат.Выбрать().Количество(), стМакроколонки, ВремяНачалаЗапроса, ДлительностьВМиллисекундах,
					Ложь, ЗапросИД);
				маРезультатПакета.Добавить(стРезультат);

			КонецЕсли;

		ИначеЕсли ТипЗнч(ЗапросСхемы) = Тип("ЗапросУничтоженияТаблицыСхемыЗапроса") Тогда
			Запрос.Текст = "УНИЧТОЖИТЬ " + ЗапросСхемы.ИмяТаблицы;
			Запрос.Выполнить();
		Иначе
			Возврат "Неизвестный тип запроса схемы";
		КонецЕсли;

	КонецЦикла;

	Возврат маРезультатПакета;

КонецФункции


&НаСервере
Процедура ВыполнитьАлгоритмПередВыполнениемЗапроса(Запрос, ТекстАлгоритма)
	Контекст = Новый Структура;
	Контекст.Вставить("мЗапрос", Запрос);

	Результат = УИ_РедакторКодаКлиентСервер.ВыполнитьАлгоритм(ТекстАлгоритма,
															  Контекст,
															  Ложь,
															  ЭтотОбъект,
															  "АлгоритмПередВыполнением");
	Если Не Результат.Успешно Тогда
		ВызватьИсключение Результат.ОписаниеОшибки;
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура УстановитьПараметрыМакроколонокЗапроса(Запрос)

	Если Объект.ОпцияОбрабатывать__ Тогда

		КоллекцияПараметров = Запрос.НайтиПараметры();
		Для Каждого ПараметрЗапроса Из КоллекцияПараметров Цикл

			Если СтрНачинаетсяС(ПараметрЗапроса.Имя, МакроПараметр) Тогда
				Запрос.УстановитьПараметр(ПараметрЗапроса.Имя, Null);
			КонецЕсли;

		КонецЦикла;

	КонецЕсли;

КонецПроцедуры

&НаСервере
Функция ВыполнитьЗапросНаСервере(ТекстЗапросаДляВыполнения, ТекстАлгоритмаПередВыполнением)
	Перем НомерСтроки, НомерКолонки;

	ВыполняемыйЗапрос = Новый Запрос;
	ВыполняемыйЗапрос.МенеджерВременныхТаблиц = ЗагрузитьВременныеТаблицы();

	Для Каждого СтрокаПараметра Из ПараметрыЗапроса Цикл
	
		Если Не СтрокаПараметра.Использовать Тогда
			Продолжить;
		КонецЕсли;			
			
		Если Объект.ОпцияОбрабатывать__ И СтрНачинаетсяС(СтрокаПараметра.Имя, МакроПараметр) Тогда
			Продолжить;
		КонецЕсли;
	
		Значение = ПараметрыЗапроса_ПолучитьЗначение(СтрокаПараметра.ПолучитьИдентификатор());
		ВыполняемыйЗапрос.УстановитьПараметр(СтрокаПараметра.Имя, Значение);

	КонецЦикла;
		
	ВыполняемыйЗапрос.Текст = ТекстЗапросаДляВыполнения;
	Попытка
		ВыполнитьАлгоритмПередВыполнениемЗапроса(ВыполняемыйЗапрос, ТекстАлгоритмаПередВыполнением);
	Исключение
		СтрокаОшибки = ОписаниеОшибки();
		РазобратьОшибкуЗапросаСУточнением(СтрокаОшибки, ВыполняемыйЗапрос, ТекстЗапросаДляВыполнения, НомерСтроки, НомерКолонки);
		Возврат Новый Структура("ОписаниеОшибки, Строка, Колонка, ВремяНачала, ВремяОкончания", СтрокаОшибки,
			НомерСтроки, НомерКолонки);
		
	КонецПопытки;
	
	СхемаЗапроса = Новый СхемаЗапроса;

	Попытка
		//ВыполняемыйЗапрос.Текст = ТекстЗапросаДляВыполнения;
		УстановитьПараметрыМакроколонокЗапроса(ВыполняемыйЗапрос);
		СхемаЗапроса.УстановитьТекстЗапроса(ВыполняемыйЗапрос.Текст);
	Исключение
		СтрокаОшибки = ОписаниеОшибки();
		РазобратьОшибкуЗапросаСУточнением(СтрокаОшибки, ВыполняемыйЗапрос, ВыполняемыйЗапрос.Текст, НомерСтроки, НомерКолонки);
		Возврат Новый Структура("ОписаниеОшибки, Строка, Колонка, ВремяНачала, ВремяОкончания", СтрокаОшибки,
			НомерСтроки, НомерКолонки);
	КонецПопытки;

	Если ОграничениеВыводимыхСтрокПервыеВкл И ОграничениеВыводимыхСтрокПервые > 0 Тогда

		Для Каждого ЗапросСхемы Из СхемаЗапроса.ПакетЗапросов Цикл
			Если ТипЗнч(ЗапросСхемы) = Тип("ЗапросВыбораСхемыЗапроса") И Не ЗначениеЗаполнено(
				ЗапросСхемы.ТаблицаДляПомещения) Тогда
				Для Каждого Оператор Из ЗапросСхемы.Операторы Цикл
					Если Не ЗначениеЗаполнено(Оператор.КоличествоПолучаемыхЗаписей) Тогда
						Оператор.КоличествоПолучаемыхЗаписей = ОграничениеВыводимыхСтрокПервые;
					КонецЕсли;
				КонецЦикла;
			КонецЕсли;
		КонецЦикла;

	КонецЕсли;

	ВремяНачала = ТекущаяУниверсальнаяДатаВМиллисекундах();
	Попытка
		маРезультатЗапроса = ВыполнитьПакет(ВыполняемыйЗапрос, СхемаЗапроса);
		ВремяОкончания = ТекущаяУниверсальнаяДатаВМиллисекундах();
		Если ТипЗнч(маРезультатЗапроса) <> Тип("Массив") Тогда
			ВызватьИсключение маРезультатЗапроса;
		КонецЕсли;
	Исключение
		ВремяОкончания = ТекущаяУниверсальнаяДатаВМиллисекундах();
		ВыполняемыйЗапрос.МенеджерВременныхТаблиц = ЗагрузитьВременныеТаблицы();
		СтрокаОшибки = ОписаниеОшибки();
		РазобратьОшибкуЗапросаСУточнением(СтрокаОшибки, ВыполняемыйЗапрос, ТекстЗапросаДляВыполнения, НомерСтроки, НомерКолонки);
		Возврат Новый Структура("ОписаниеОшибки, Строка, Колонка, ВремяНачала, ВремяОкончания", СтрокаОшибки,
			НомерСтроки, НомерКолонки, ВремяНачала, ВремяОкончания);
	КонецПопытки;

	стРезультат = Новый Структура("Результат, Параметры", маРезультатЗапроса, ВыполняемыйЗапрос.Параметры);
	Если ЗначениеЗаполнено(АдресРезультатаЗапроса) Тогда
		АдресРезультатаЗапроса = ПоместитьВоВременноеХранилище(стРезультат, АдресРезультатаЗапроса);
	Иначе
		АдресРезультатаЗапроса = ПоместитьВоВременноеХранилище(стРезультат, УникальныйИдентификатор);
	КонецЕсли;

	Элементы.РезультатВПакете.СписокВыбора.Очистить();
	ПакетРезультатаЗапроса.Очистить();
	Для й = 1 По маРезультатЗапроса.Количество() Цикл

		стРезультат = маРезультатЗапроса[й - 1];
		Элементы.РезультатВПакете.СписокВыбора.Добавить(Строка(й), стРезультат.ИмяРезультата + " ("
			+ стРезультат.КоличествоЗаписей + ")");

		СтрокаПакета = ПакетРезультатаЗапроса.Добавить();
		СтрокаПакета.Имя = стРезультат.ИмяРезультата;
		СтрокаПакета.ТипРезультата = ?(стРезультат.СозданиеВременнойТаблицы, 0, 1);
		СтрокаПакета.Инфо = СтрШаблон("%1 / %2", стРезультат.КоличествоЗаписей, ФорматироватьДлительность(
			стРезультат.ДлительностьВМиллисекундах));

	КонецЦикла;

	Возврат Новый Структура("ОписаниеОшибки, Строка, Колонка, ВремяНачала, ВремяОкончания, КоличествоРезультатов", , ,
		, ВремяНачала, ВремяОкончания, маРезультатЗапроса.Количество());

КонецФункции

#КонецОбласти

&НаКлиенте
Функция ПереместитьСтрокуДерева(Дерево, ПеремещаемаяСтрока, ИндексВставки, НовыйРодитель, Уровень = 0)

	Если Уровень = 0 Тогда

		Если НовыйРодитель = Неопределено Тогда
			НоваяСтрока = Дерево.ПолучитьЭлементы().Вставить(ИндексВставки);
		Иначе
			НоваяСтрока = НовыйРодитель.ПолучитьЭлементы().Вставить(ИндексВставки);
		КонецЕсли;

		ЗаполнитьЗначенияСвойств(НоваяСтрока, ПеремещаемаяСтрока);
		ПереместитьСтрокуДерева(Дерево, ПеремещаемаяСтрока, ИндексВставки, НоваяСтрока, Уровень + 1);

		ПеремещаемаяСтрокаРодитель = ПеремещаемаяСтрока.ПолучитьРодителя();
		Если ПеремещаемаяСтрокаРодитель = Неопределено Тогда
			Дерево.ПолучитьЭлементы().Удалить(ПеремещаемаяСтрока);
		Иначе
			ПеремещаемаяСтрокаРодитель.ПолучитьЭлементы().Удалить(ПеремещаемаяСтрока);
		КонецЕсли;

	Иначе

		Для Каждого Строка Из ПеремещаемаяСтрока.ПолучитьЭлементы() Цикл
			НоваяСтрока = НовыйРодитель.ПолучитьЭлементы().Добавить();
			ЗаполнитьЗначенияСвойств(НоваяСтрока, ПеремещаемаяСтрока);
			ПереместитьСтрокуДерева(Дерево, Строка, НоваяСтрока, ИндексВставки, Уровень + 1);
		КонецЦикла;

	КонецЕсли;

	Возврат НоваяСтрока;

КонецФункции

&НаКлиенте
Процедура ОшибкаКонсоли(СтрокаОшибки)
	ВызватьИсключение СтрокаОшибки;
КонецПроцедуры

&НаКлиенте
Процедура УстановитьИмяФайлаЗапросов(стрПолноеИмя = "")

	ИмяФайлаЗапросов = стрПолноеИмя;
	Если ЗначениеЗаполнено(ИмяФайлаЗапросов) Тогда
		Файл = Новый Файл(стрПолноеИмя);
		ПакетЗапросов_ИмяДляОтображения = Файл.Имя;
		ПакетЗапросов_ИмяДляПодсказки = Файл.ПолноеИмя;
	Иначе
		ПакетЗапросов_ИмяДляОтображения = "Имя";
		ПакетЗапросов_ИмяДляПодсказки = "Имя";
	КонецЕсли;

	Элементы.ПакетЗапросов.ПодчиненныеЭлементы.СписокЗапросовЗапрос.Заголовок = ПакетЗапросов_ИмяДляОтображения;
	Элементы.ПакетЗапросов.ПодчиненныеЭлементы.СписокЗапросовЗапрос.Подсказка = ПакетЗапросов_ИмяДляПодсказки;

КонецПроцедуры

&НаКлиенте
Функция СохранитьСВопросом(ДополнительныеПараметры)

	Если Модифицированность Тогда
		ПоказатьВопрос(
			Новый ОписаниеОповещения("ПослеВопросаСохранения", ЭтаФорма, ДополнительныеПараметры),
			"Имеется не сохраненный пакет запросов. Сохранить?", РежимДиалогаВопрос.ДаНетОтмена, ,
			КодВозвратаДиалога.Да);
		Возврат Ложь;
	КонецЕсли;

	Возврат Истина;

КонецФункции

&НаКлиенте
Процедура ЗавершениеПослеВопроса(РезультатВопроса, ДополнительныеПараметры)

	Если РезультатВопроса = КодВозвратаДиалога.Да Тогда
		СохранитьПакетЗапросов(Новый Структура("Завершение", Истина));
	ИначеЕсли РезультатВопроса = КодВозвратаДиалога.Нет Тогда
		Если ЗначениеЗаполнено(ИмяФайлаЗапросов) Тогда
			ОписаниеОповещения = Новый ОписаниеОповещения("ЗавершениеПослеУдаления", ЭтаФорма);
			НачатьУдалениеФайлов(ОписаниеОповещения, ПолучитьИмяФайлаАвтосохранения(ИмяФайлаЗапросов));
		Иначе
			ОписаниеОповещения = Новый ОписаниеОповещения("ЗавершениеПослеУдаления", ЭтаФорма);
			НачатьУдалениеФайлов(ОписаниеОповещения, ИмяФайлаАвтосохраненияСостояния);
		КонецЕсли;
	ИначеЕсли РезультатВопроса = КодВозвратаДиалога.Отмена Тогда
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ЗавершениеПослеУдаления(ДополнительныеПараметры) Экспорт
	Модифицированность = Ложь;
	Закрыть();
КонецПроцедуры

&НаКлиенте
Процедура Автосохранить(Оповещение = Неопределено)

	ПоместитьРедактируемыйЗапрос();

	Если ЗначениеЗаполнено(ИмяФайлаЗапросов) Тогда
		ПакетЗапросов_Сохранить(Оповещение, ПолучитьИмяФайлаАвтосохранения(ИмяФайлаЗапросов));
		ПакетЗапросов_Сохранить( , ИмяФайлаАвтосохраненияСостояния, Истина);
	Иначе
		ПакетЗапросов_Сохранить(Оповещение, ИмяФайлаАвтосохраненияСостояния);
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Функция ПараметрыЗапросаВСписокЗначений(ПараметрыДанныеФормыКоллекция)

	сзПараметрыЗапроса = Новый СписокЗначений;
	Для Каждого СтрокаПараметра Из ПараметрыДанныеФормыКоллекция Цикл
		стПараметр = Новый Структура("Имя, ТипЗначения, Значение, ТипКонтейнера, Контейнер, Использовать");
		ЗаполнитьЗначенияСвойств(стПараметр, СтрокаПараметра);
		сзПараметрыЗапроса.Добавить(стПараметр);
	КонецЦикла;

	Возврат сзПараметрыЗапроса;

КонецФункции

&НаКлиенте
Функция ВременныеТаблицыВСписокЗначений(ВременныеТаблицыДанныеФормыКоллекция)

	сзВременныеТаблицы = Новый СписокЗначений;
	Для Каждого СтрокаТаблицы Из ВременныеТаблицыДанныеФормыКоллекция Цикл
		стТаблица = Новый Структура("Имя, Контейнер, Значение");
		ЗаполнитьЗначенияСвойств(стТаблица, СтрокаТаблицы);
		сзВременныеТаблицы.Добавить(стТаблица);
	КонецЦикла;

	Возврат сзВременныеТаблицы;

КонецФункции

&НаКлиенте
Процедура ПараметрыЗапросаИзСпискаЗначений(сзПараметры, ПараметрыДанныеФормыКоллекция)

	ПараметрыДанныеФормыКоллекция.Очистить();

	Если сзПараметры <> Неопределено Тогда

		Для Каждого кзПараметр Из сзПараметры Цикл
			ЗаполнитьЗначенияСвойств(ПараметрыДанныеФормыКоллекция.Добавить(), кзПараметр.Значение);
		КонецЦикла;

	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ВременныеТаблицыИзСпискаЗначений(сзВременныеТаблицы, ВременныеТаблицыДанныеФормыКоллекция)

	ВременныеТаблицыДанныеФормыКоллекция.Очистить();

	Если сзВременныеТаблицы <> Неопределено Тогда

		Для Каждого кзТаблица Из сзВременныеТаблицы Цикл
			ЗаполнитьЗначенияСвойств(ВременныеТаблицыДанныеФормыКоллекция.Добавить(), кзТаблица.Значение);
		КонецЦикла;

	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ОбновитьИконкиСтраницАлгоритмов(стДанныеЗапроса)
	ИконкаЗаполнена = БиблиотекаКартинок.СинтаксическийКонтроль;
	
	Если ЗначениеЗаполнено(стДанныеЗапроса.ТекстКод) Тогда
		Элементы.СтраницаАлгоритм.Картинка = ИконкаЗаполнена;
	Иначе
		Элементы.СтраницаАлгоритм.Картинка = Новый Картинка;
	КонецЕсли;
	
	Если ЗначениеЗаполнено(стДанныеЗапроса.АлгоритмПередВыполнением) Тогда
		Элементы.СтраницаАлгоритмПередВыполнением.Картинка = ИконкаЗаполнена;
	Иначе
		Элементы.СтраницаАлгоритмПередВыполнением.Картинка = Новый Картинка;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьСостояниеЭлементовФормыАлгоритма()
	
	//Если ФоновоеЗаданиеИдентификатор заполнен - то происходит выполнение кода в фоновом задании.
	//В этом случае управление элементами происходит в процедурах отображения прогресса.
	Если Не ЗначениеЗаполнено(ФоновоеЗаданиеИдентификатор) Тогда

		Если Элементы.ПакетЗапросов.ТекущиеДанные <> Неопределено И ИмяЗапросаРезультата
			= Элементы.ПакетЗапросов.ТекущиеДанные.Имя Тогда
			Элементы.ВыполнитьОбработку.Доступность = Истина;
			СостояниеВыполнения = "";
			Элементы.СтруктураЗаписиРезультата.Доступность = Истина;
		Иначе
			Элементы.ВыполнитьОбработку.Доступность = Ложь;
			СостояниеВыполнения = "(запрос не выполнен)";
			Элементы.СтруктураЗаписиРезультата.Доступность = Ложь;
		КонецЕсли;
	КонецЕсли;

КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция ИмяОбработкиКонсоли(Форма)
	МассивИмениФормы=СтрРазделить(Форма.ИмяФормы, ".");
	Возврат МассивИмениФормы[1];
КонецФункции

#Область ПараметрыЗапроса

//Работа с параметром запроса, хранимым в виде строки таблицы ПараметрыЗапроса. Далее везде параметр с именем "СтрокаИд" - это идентификатор строка этой таблицы.

&НаСервере
Функция ПараметрыЗапроса_ПолучитьЗначение(СтрокаИд)

	СтрокаПараметр = ПараметрыЗапроса.НайтиПоИдентификатору(СтрокаИд);

	Если СтрокаПараметр.ТипКонтейнера = 0 Или СтрокаПараметр.ТипКонтейнера = 1 Или СтрокаПараметр.ТипКонтейнера = 2
		Или СтрокаПараметр.ТипКонтейнера = 3 Тогда
		Возврат РеквизитФормыВЗначение("Объект").Контейнер_ВосстановитьЗначение(СтрокаПараметр.Контейнер);
	Иначе
		ВызватьИсключение "Ошибка в типе контейнера параметра";
	КонецЕсли;

КонецФункции

&НаСервере
Процедура ПараметрыЗапроса_СохранитьЗначение(СтрокаИд, Знач Значение)

	СтрокаПараметр = ПараметрыЗапроса.НайтиПоИдентификатору(СтрокаИд);

	Если СтрокаПараметр.ТипКонтейнера = 0 Тогда
		СтрокаПараметр.Контейнер = РеквизитФормыВЗначение("Объект").Контейнер_СохранитьЗначение(Значение);
		Если ТипЗнч(СтрокаПараметр.Контейнер) = Тип("Структура") Тогда
			СтрокаПараметр.Значение = СтрокаПараметр.Контейнер.Представление;
		Иначе
			СтрокаПараметр.Значение = Значение;
		КонецЕсли;
	ИначеЕсли СтрокаПараметр.ТипКонтейнера = 1 Тогда
		СтрокаПараметр.Контейнер = РеквизитФормыВЗначение("Объект").Контейнер_СохранитьЗначение(Значение);
		СтрокаПараметр.Значение = СтрокаПараметр.Контейнер.Представление;
	ИначеЕсли СтрокаПараметр.ТипКонтейнера = 2 Тогда
		СтрокаПараметр.Контейнер = РеквизитФормыВЗначение("Объект").Контейнер_СохранитьЗначение(Значение);
		СтрокаПараметр.Значение = СтрокаПараметр.Контейнер.Представление;
	ИначеЕсли СтрокаПараметр.ТипКонтейнера = 3 Тогда
		СтрокаПараметр.ТипЗначения = "Таблица значений";
		СтрокаПараметр.Контейнер = РеквизитФормыВЗначение("Объект").Контейнер_СохранитьЗначение(Значение);
		СтрокаПараметр.Значение = СтрокаПараметр.Контейнер.Представление;
	Иначе
		ВызватьИсключение "Ошибка в типе контейнера параметра";
	КонецЕсли;

	Модифицированность = Истина;

КонецПроцедуры

&НаСервере
//Контейнер типа 1 и типа 2 (список значений или массив) возвращаем в виде массива
Функция Контейнер12ВМассив(Контейнер)

	Значение = РеквизитФормыВЗначение("Объект").Контейнер_ВосстановитьЗначение(Контейнер);

	Если ТипЗнч(Значение) = Тип("СписокЗначений") Тогда
		Возврат Значение.ВыгрузитьЗначения();
	ИначеЕсли ТипЗнч(Значение) = Тип("Массив") Тогда
		Возврат Значение;
	КонецЕсли;

	Возврат Неопределено;

КонецФункции

&НаСервере
Процедура ПараметрыЗапроса_УстановитьТип(СтрокаИд, ТипКонтейнера, ТипЗначения)

	СтрокаПараметр = ПараметрыЗапроса.НайтиПоИдентификатору(СтрокаИд);
	Контейнер = СтрокаПараметр.Контейнер;

	Если ТипКонтейнера = 1 Или ТипКонтейнера = 2 Тогда

		Если СтрокаПараметр.ТипКонтейнера = 1 Или СтрокаПараметр.ТипКонтейнера = 2 Тогда
			КонтейнерМассив = Контейнер12ВМассив(Контейнер);
		ИначеЕсли СтрокаПараметр.ТипКонтейнера = 3 Тогда
			//Была ТЗ, теперь СЗ. Надо достать первую ячейку.
			Таблица = РеквизитФормыВЗначение("Объект").Контейнер_ВосстановитьЗначение(Контейнер);
			КонтейнерМассив = Таблица.ВыгрузитьКолонку(0);
		ИначеЕсли СтрокаПараметр.ТипКонтейнера = 0 Тогда

			КонтейнерМассив = Новый Массив;

			КонтейнерМассив.Добавить(РеквизитФормыВЗначение("Объект").Контейнер_ВосстановитьЗначение(Контейнер));
			//Если ЗначениеЗаполнено(СтрокаПараметр.Значение) Тогда
			//	КонтейнерМассив.Добавить(СтрокаПараметр.Значение);
			//КонецЕсли;

			СтрокаПараметр.Значение = Неопределено;

		КонецЕсли;

		Если ТипКонтейнера = 1 Тогда
			НовыйСписок = Новый СписокЗначений;
			НовыйСписок.ЗагрузитьЗначения(КонтейнерМассив);
			НовыйСписок.ТипЗначения = ТипЗначения;
			СтрокаПараметр.Контейнер = РеквизитФормыВЗначение("Объект").Контейнер_СохранитьЗначение(НовыйСписок);
		ИначеЕсли ТипКонтейнера = 2 Тогда
			НовыйСписок = Новый СписокЗначений;
			НовыйСписок.ЗагрузитьЗначения(КонтейнерМассив);
			НовыйСписок.ТипЗначения = ТипЗначения;
			КонтейнерМассив = НовыйСписок.ВыгрузитьЗначения();
			СтрокаПараметр.Контейнер = РеквизитФормыВЗначение("Объект").Контейнер_СохранитьЗначение(КонтейнерМассив);
		КонецЕсли;

	ИначеЕсли ТипКонтейнера = 3 Тогда

		Если СтрокаПараметр.ТипКонтейнера = 1 Или СтрокаПараметр.ТипКонтейнера = 2 Тогда
			Таблица = РеквизитФормыВЗначение("Объект").Контейнер_ВосстановитьЗначение(ТипЗначения);
			Значение = РеквизитФормыВЗначение("Объект").Контейнер_ВосстановитьЗначение(Контейнер);
			Если ТипЗнч(Значение) = Тип("СписокЗначений") Тогда
				Значение = Значение.ВыгрузитьЗначения();
			КонецЕсли;
			Для Каждого ъ Из Значение Цикл
				Таблица.Добавить()[0] = ъ;
			КонецЦикла;
			НовыйКонтейнер = РеквизитФормыВЗначение("Объект").Контейнер_СохранитьЗначение(Таблица);
		ИначеЕсли СтрокаПараметр.ТипКонтейнера = 3 Тогда
			Контейнер = ТипЗначения;
			//Теперь не копируем, преобразование уже выполняет редактор типа!
			//СкопироватьДанныеКонтейнераТипа3(Контейнер, СтрокаПараметр.Контейнер);
			НовыйКонтейнер = Контейнер;
		ИначеЕсли СтрокаПараметр.ТипКонтейнера = 0 Тогда
			Таблица = РеквизитФормыВЗначение("Объект").Контейнер_ВосстановитьЗначение(ТипЗначения);
			Таблица.Добавить()[0] = СтрокаПараметр.Значение;
			НовыйКонтейнер = РеквизитФормыВЗначение("Объект").Контейнер_СохранитьЗначение(Таблица);
		КонецЕсли;

		СтрокаПараметр.Контейнер = НовыйКонтейнер;

	ИначеЕсли ТипКонтейнера = 0 Тогда

		Если СтрокаПараметр.ТипКонтейнера = 1 Или СтрокаПараметр.ТипКонтейнера = 2 Тогда
			КонтейнерМассив = Контейнер12ВМассив(Контейнер);
			Если КонтейнерМассив.Количество() > 0 Тогда
				СтрокаПараметр.Контейнер = РеквизитФормыВЗначение("Объект").Контейнер_СохранитьЗначение(
					ТипЗначения.ПривестиЗначение(КонтейнерМассив[0]));
			КонецЕсли;
		ИначеЕсли СтрокаПараметр.ТипКонтейнера = 3 Тогда
			сз = ПараметрыЗапросаФормаПриИзмененииСЗИзТЗ(Контейнер);
			Если сз.Количество() > 0 Тогда
				СтрокаПараметр.Контейнер = РеквизитФормыВЗначение("Объект").Контейнер_СохранитьЗначение(
					ТипЗначения.ПривестиЗначение(сз.СписокЗначений[0].Значение));
			КонецЕсли;
		ИначеЕсли СтрокаПараметр.ТипКонтейнера = 0 Тогда
			СтрокаПараметр.Контейнер = РеквизитФормыВЗначение("Объект").Контейнер_СохранитьЗначение(
				ТипЗначения.ПривестиЗначение(РеквизитФормыВЗначение("Объект").Контейнер_ВосстановитьЗначение(
				СтрокаПараметр.Контейнер)));
		КонецЕсли;

	КонецЕсли;

	СтрокаПараметр.ТипКонтейнера = ТипКонтейнера;
	Если СтрокаПараметр.ТипКонтейнера = 3 Тогда
		СтрокаПараметр.ТипЗначения = "Таблица значений";
	Иначе
		СтрокаПараметр.ТипЗначения = ТипЗначения;
	КонецЕсли;

	Модифицированность = Истина;

	Если ТипЗнч(СтрокаПараметр.Контейнер) = Тип("Структура") Тогда
		СтрокаПараметр.Значение = СтрокаПараметр.Контейнер.Представление;
	Иначе
		СтрокаПараметр.Значение = СтрокаПараметр.Контейнер;
	КонецЕсли;

КонецПроцедуры

//@skip-warning
&НаСервере
Процедура СкопироватьДанныеКонтейнераТипа3(КонтейнерНовый, КонтейнерСтарый)

	Обработка = РеквизитФормыВЗначение("Объект");
	ТаблицаНовая = Обработка.СтрокаВЗначение(КонтейнерНовый.Значение);
	ТаблицаСтарая = Обработка.СтрокаВЗначение(КонтейнерСтарый.Значение);

	ТаблицаНовая.Очистить();
	
	//Если одинаковых колонок нет, то копировать нечего.
	фОдинаковыеЕсть = Ложь;
	Для Каждого КолонкаНовая Из ТаблицаНовая.Колонки Цикл
		Если ТаблицаСтарая.Колонки.Найти(КолонкаНовая.Имя) <> Неопределено Тогда
			фОдинаковыеЕсть = Истина;
			Прервать;
		КонецЕсли;
	КонецЦикла;

	Если фОдинаковыеЕсть Тогда
		Для Каждого СтрокаСтарая Из ТаблицаСтарая Цикл
			СтрокаНовая = ТаблицаНовая.Добавить();
			ЗаполнитьЗначенияСвойств(СтрокаНовая, СтрокаСтарая);
		КонецЦикла;
		КонтейнерНовый.КоличествоСтрок = КонтейнерСтарый.КоличествоСтрок;
	Иначе
		КонтейнерНовый.КоличествоСтрок = 0;
	КонецЕсли;

	КонтейнерНовый.Значение = Обработка.ЗначениеВСтроку(ТаблицаНовая);
	КонтейнерНовый.Представление = Обработка.Контейнер_ПолучитьПредставление(КонтейнерНовый);

КонецПроцедуры

&НаСервере
Функция ПараметрыЗапроса_ПолучитьКакСтроку()

	тзПараметры = Новый ТаблицаЗначений;
	тзПараметры.Колонки.Добавить("Имя", Новый ОписаниеТипов("Строка"));
	тзПараметры.Колонки.Добавить("Значение");
	Для Каждого СтрокаПараметра Из ПараметрыЗапроса Цикл
		СтрокаТаблицы = тзПараметры.Добавить();
		СтрокаТаблицы.Имя = СтрокаПараметра.Имя;
		СтрокаТаблицы.Значение = ПараметрыЗапроса_ПолучитьЗначение(СтрокаПараметра.ПолучитьИдентификатор());
	КонецЦикла;

	Возврат РеквизитФормыВЗначение("Объект").ЗначениеВСтроку(тзПараметры);

КонецФункции

#КонецОбласти //ПараметрыЗапроса

#Область ПакетЗапросов

&НаКлиенте
Процедура ИнициализироватьЗапрос(ТекущаяСтрока)

	Если Не ЗначениеЗаполнено(ТекущаяСтрока.Имя) Тогда
		КоличествоЗапросов = КоличествоЗапросов + 1;
		ТекущаяСтрока.Имя = "Запрос" + КоличествоЗапросов;
	КонецЕсли;

	ТекущаяСтрока.Инициализирован = Истина;

КонецПроцедуры

&НаКлиенте
Процедура ПоместитьРедактируемыйЗапрос()
	Если РедактируемыйЗапрос >= 0 Тогда
		стрТекстЗапроса = ТекущийТекстЗапроса();
		стрТекстАлгоритм = ТекущийТекстАлгоритма();
		стрТекстАлгоритмПередВыполнением = ТекущийАлгоритмПередВыполнением();
		
		ГраницыВыделенияАлгоритма = ГраницыВыделенияАлгоритма();	
		ГраницыВыделенияЗапроса = ГраницыВыделенияЗапроса();	
			
		Запрос_ПоместитьДанныеЗапроса(РедактируемыйЗапрос, стрТекстЗапроса, стрТекстАлгоритм, МетодИсполненияКода,
			ПараметрыЗапросаВСписокЗначений(ПараметрыЗапроса), ВременныеТаблицыВСписокЗначений(ВременныеТаблицы),
			ГраницыВыделенияЗапроса.НачалоСтроки, ГраницыВыделенияЗапроса.НачалоКолонки,
			ГраницыВыделенияЗапроса.КонецСтроки, ГраницыВыделенияЗапроса.КонецКолонки,
			ГраницыВыделенияАлгоритма.НачалоСтроки, ГраницыВыделенияАлгоритма.НачалоКолонки,
			ГраницыВыделенияАлгоритма.КонецСтроки, ГраницыВыделенияАлгоритма.КонецКолонки,
			стрТекстАлгоритмПередВыполнением);
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура УстановитьДоступностьРедактированияЗапроса(Доступность)
	Элементы.ТекстЗапроса.ТолькоПросмотр = Не Доступность;
	Элементы.ГруппаКоманднаяПанельЗапроса.Доступность = Доступность;
КонецПроцедуры

&НаКлиенте
Процедура ИзвлечьРедактируемыйЗапрос(ЗапросКроме = Неопределено, ВосстановитьПозийиюРедактирования = Истина)
	ТекущаяСтрока = Элементы.ПакетЗапросов.ТекущаяСтрока;

	Если РедактируемыйЗапрос <> ЗапросКроме Тогда
		ПоместитьРедактируемыйЗапрос();
	КонецЕсли;

	Если ТекущаяСтрока = Неопределено Тогда
		УстановитьТекстЗапроса("", Истина, "");
		УстановитьТекстАлгоритма("", Истина, "");
		УстановитьТекстАлгоритмаПередВыполнением("", Истина, "");
		УстановитьДоступностьРедактированияЗапроса(Ложь);
		Элементы.ГруппаЗапросСтраницы.ПодчиненныеЭлементы.СтраницаЗапрос.Заголовок = "Запрос";
		ПараметрыЗапроса.Очистить();
		ВременныеТаблицы.Очистить();
		Возврат;
	КонецЕсли;

	стДанныеЗапроса = Запрос_ПолучитьДанныеЗапроса(ТекущаяСтрока);

	УстановитьТекстЗапроса(стДанныеЗапроса.Запрос, Истина, стДанныеЗапроса.ЗапросОригинальный);

	УстановитьТекстАлгоритма(стДанныеЗапроса.ТекстКод, Истина, стДанныеЗапроса.ТекстКодОригинальный);
	УстановитьТекстАлгоритмаПередВыполнением(стДанныеЗапроса.АлгоритмПередВыполнением, Истина,
		стДанныеЗапроса.АлгоритмПередВыполнениемОригинальный);
	МетодИсполненияКода = стДанныеЗапроса.МетодИсполненияКода;

	ПараметрыЗапросаИзСпискаЗначений(стДанныеЗапроса.Параметры, ПараметрыЗапроса);
	ВременныеТаблицыИзСпискаЗначений(стДанныеЗапроса.ВременныеТаблицы, ВременныеТаблицы);

	Если стДанныеЗапроса.ВКонструкторе Тогда
		УстановитьДоступностьРедактированияЗапроса(Ложь);
		Элементы.ГруппаЗапросСтраницы.ПодчиненныеЭлементы.СтраницаЗапрос.Заголовок = "Запрос (в конструкторе)";
	Иначе
		УстановитьДоступностьРедактированияЗапроса(Истина);
		Элементы.ГруппаЗапросСтраницы.ПодчиненныеЭлементы.СтраницаЗапрос.Заголовок = "Запрос";
	КонецЕсли;

	РедактируемыйЗапрос = Элементы.ПакетЗапросов.ТекущаяСтрока;

	ОбновитьСостояниеЭлементовФормыАлгоритма();
	ОбновитьИконкиСтраницАлгоритмов(стДанныеЗапроса);
	// + УИ
	Если УИ_ЕстьПодсистемаЗарплатаКадры Тогда
		УИ_УстановитьСостояниеВставкиКодаЗаменыПредставлений();
	КонецЕсли;
	// - УИ

	Если ВосстановитьПозийиюРедактирования Тогда
		ПодключитьОбработчикОжидания("ВосстановлениеПозицииРедактирования", 0.01, Истина);
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ВосстановлениеПозицииРедактирования()

	ТекущаяСтрока = Элементы.ПакетЗапросов.ТекущаяСтрока;
	стДанныеЗапроса = Запрос_ПолучитьДанныеЗапроса(ТекущаяСтрока);

	УстановитьГраницыВыделенияЗапроса(стДанныеЗапроса.КурсорНачалоСтроки, стДанныеЗапроса.КурсорНачалоКолонки,
		стДанныеЗапроса.КурсорКонецСтроки, стДанныеЗапроса.КурсорКонецКолонки);

	УстановитьГраницыВыделенияАлгоритма(стДанныеЗапроса.КодКурсорНачалоСтроки, стДанныеЗапроса.КодКурсорНачалоКолонки,
		стДанныеЗапроса.КодКурсорКонецСтроки, стДанныеЗапроса.КодКурсорКонецКолонки);

	Если Элементы.ГруппаЗапросСтраницы.ТекущаяСтраница = Элементы.СтраницаЗапрос Тогда
		ТекущийЭлемент = Элементы.ТекстЗапроса;
	ИначеЕсли Элементы.ГруппаЗапросСтраницы.ТекущаяСтраница = Элементы.СтраницаАлгоритм Тогда
		ТекущийЭлемент = Элементы.ТекстАлгоритм;
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ПакетЗапросов_Инициализировать(Элемент = Неопределено)

	Если Элемент = Неопределено Тогда
		Элемент = ПакетЗапросов;
	КонецЕсли;

	Для Каждого ПодчиненныйЭлемент Из Элемент.ПолучитьЭлементы() Цикл
		ПодчиненныйЭлемент.ВКонструкторе = Ложь;
		ПодчиненныйЭлемент.ТекстЗапросаОригинальный = ПодчиненныйЭлемент.ТекстЗапроса;
		ПодчиненныйЭлемент.ТекстКодОригинальный = ПодчиненныйЭлемент.ТекстКод;
		ПодчиненныйЭлемент.АлгоритмПередВыполнениемОригинальный = ПодчиненныйЭлемент.АлгоритмПередВыполнением;
		ПакетЗапросов_Инициализировать(ПодчиненныйЭлемент);
	КонецЦикла;

КонецПроцедуры

&НаКлиенте
Процедура ПакетЗапросов_Новый()

	ПакетЗапросов.ПолучитьЭлементы().Очистить();
	КоличествоЗапросов = 0;
	ИнициализироватьЗапрос(ПакетЗапросов.ПолучитьЭлементы().Добавить());
	ПакетЗапросов_Инициализировать();
	Модифицированность = Ложь;
	УстановитьИмяФайлаЗапросов();
	РедактируемыйЗапрос = -1;

	ОпцияИнтервалАвтосохранения = 60;
	ОпцияСохранятьКомментарии = Истина;
	ОпцияАвтосохранениеПередВыполнениемЗапроса = Истина;
	//ОпцияИнтервалОбновленияВыполненияАлгоритма = 1000;
	ОпцияПериодОпросаВключенияВыключенияТехнологическогоЖурнала = 3;
	Объект.ОпцияОбрабатывать__ = Истина;
	Объект.ОпцияИнтервалОбновленияВыполненияАлгоритма = 1000;

КонецПроцедуры

&НаКлиенте
Функция ПакетЗапросов_СтрокиВМассив(Строки)

	маСтроки = Новый Массив;

	Для Каждого Элемент Из Строки.ПолучитьЭлементы() Цикл
		стЭлемент = Новый Структура("Имя, ТекстЗапроса, ТекстКод, МетодИсполненияКода, ПараметрыЗапроса, ВременныеТаблицы, Строки, Инфо,
									|КурсорНачалоСтроки, КурсорНачалоКолонки, КурсорКонецСтроки, КурсорКонецКолонки,
									|КодКурсорНачалоСтроки, КодКурсорНачалоКолонки, КодКурсорКонецСтроки, КодКурсорКонецКолонки,
									|АлгоритмПередВыполнением");
		ЗаполнитьЗначенияСвойств(стЭлемент, Элемент);
		стЭлемент.Строки = ПакетЗапросов_СтрокиВМассив(Элемент);
		маСтроки.Добавить(стЭлемент);
	КонецЦикла;

	Возврат маСтроки;

КонецФункции

&НаСервереБезКонтекста
Функция ПакетЗапросов_СохранитьНаСервере(Знач стДанныеДляЗаписи)
	Запись = Новый ЗаписьXML;
	Запись.УстановитьСтроку();
	СериализаторXDTO.ЗаписатьXML(Запись, стДанныеДляЗаписи, НазначениеТипаXML.Явное);
	Возврат Запись.Закрыть();
КонецФункции

&НаКлиенте
Процедура ПакетЗапросов_Сохранить(Оповещение, стрИмяФайла, фТолькоЗаголовок = Ложь)

	ТекущаяСтрока = Элементы.ПакетЗапросов.ТекущаяСтрока;

	ТекущаяСтрокаПакета = Неопределено;
	Если ТекущаяСтрока <> Неопределено Тогда
		ТекущаяСтрокаПакета = ПакетЗапросов.НайтиПоИдентификатору(ТекущаяСтрока);
	КонецЕсли;
	
	//сохраняемые состояния ++
	СохраняемыеСостояния_Сохранить("ВидРезультата", ВидРезультата);
	СохраняемыеСостояния_Сохранить("ОграничениеВыводимыхСтрок", ОграничениеВыводимыхСтрок);
	СохраняемыеСостояния_Сохранить("ОграничениеВыводимыхСтрокВкл", ОграничениеВыводимыхСтрокВкл);
	СохраняемыеСостояния_Сохранить("ОграничениеВыводимыхСтрокПервые", ОграничениеВыводимыхСтрокПервые);
	СохраняемыеСостояния_Сохранить("ОграничениеВыводимыхСтрокПервыеВкл", ОграничениеВыводимыхСтрокПервыеВкл);
	//сохраняемые состояния --
	
	//стПакетЗапросов = Новый Массив;

	стОпции = Новый Структура("
							  |ОпцияСохранятьКомментарии,
							  |ОпцияАвтосохранениеПередВыполнениемЗапроса,
							  |ОпцияПериодОпросаВключенияВыключенияТехнологическогоЖурнала,
							  |ОпцияОбрабатывать__,
							  |ОпцияИнтервалОбновленияВыполненияАлгоритма,
							  |ОпцияИнтервалАвтосохранения", ОпцияСохранятьКомментарии,
		ОпцияАвтосохранениеПередВыполнениемЗапроса, ОпцияПериодОпросаВключенияВыключенияТехнологическогоЖурнала,
		Объект.ОпцияОбрабатывать__, Объект.ОпцияИнтервалОбновленияВыполненияАлгоритма, ОпцияИнтервалАвтосохранения);

	стДанныеДляЗаписи = Новый Структура("
										|Формат,      
										|Версия,
										|КоличествоЗапросов,
										|ИмяФайла,
										|СохраняемыеСостояния,
										|ТекущийЗапрос,
										|Опции", СигнатураКонсоли, ВерсияФормата, КоличествоЗапросов, ИмяФайлаЗапросов,
		Объект.СохраняемыеСостояния, ?(ТекущаяСтрокаПакета <> Неопределено, ТекущаяСтрокаПакета.Имя, Неопределено),
		стОпции);

	Если Не фТолькоЗаголовок Тогда
		стДанныеДляЗаписи.Вставить("ПакетЗапросов", ПакетЗапросов_СтрокиВМассив(ПакетЗапросов));
	КонецЕсли;

	ДанныеДляЗаписи = ПакетЗапросов_СохранитьНаСервере(стДанныеДляЗаписи);

	ДокументЗапись = Новый ТекстовыйДокумент;
	ДокументЗапись.УстановитьТекст(ДанныеДляЗаписи);
	ДокументЗапись.НачатьЗапись(Оповещение, стрИмяФайла);

КонецПроцедуры

&НаКлиенте
Процедура ПакетЗапросов_ДобавитьСтрокиИзМассива(Строка, маЭлементы)

	ЭлементыСтроки = Строка.ПолучитьЭлементы();

	Для Каждого стЭлемент Из маЭлементы Цикл
		Элемент = ЭлементыСтроки.Добавить();
		ЗаполнитьЗначенияСвойств(Элемент, стЭлемент);
		ПакетЗапросов_ДобавитьСтрокиИзМассива(Элемент, стЭлемент.Строки);
	КонецЦикла;

КонецПроцедуры

&НаСервереБезКонтекста
Функция ПакетЗапросов_ЗагрузитьНаСервере(Знач стрЗагруженныеДанные)

	Чтение = Новый ЧтениеXML;
	Чтение.УстановитьСтроку(стрЗагруженныеДанные);
	стЗагруженныеДанные = СериализаторXDTO.ПрочитатьXML(Чтение);
	Чтение.Закрыть();

	Возврат стЗагруженныеДанные;

КонецФункции

&НаКлиенте
Функция ПакетЗапросов_ТекущийЗапрос()
	Возврат Элементы.ПакетЗапросов.ТекущаяСтрока;
КонецФункции

//Загружает пакет запросов.
//Если файл содержит только заголовок, ничего не грузить, только возвращает заголовок (кроме сохраняемых состояний, если они еще пустые).
&НаКлиенте
Процедура ПакетЗапросов_Загрузить(ДополнительныеПараметры)
	ЧитаемыйДокумент = Новый ТекстовыйДокумент;
	ДополнительныеПараметры.Вставить("Чтение", ЧитаемыйДокумент);
	Оповещение = Новый ОписаниеОповещения("ПакетЗапросов_ЗагрузитьЗавершение", ЭтаФорма, ДополнительныеПараметры,
		"ПакетЗапросов_ЗагрузитьОшибка", ЭтаФорма);
	ЧитаемыйДокумент.НачатьЧтение(Оповещение, ДополнительныеПараметры.ИмяФайла);
КонецПроцедуры

&НаКлиенте
Процедура ПакетЗапросов_ЗагрузитьОшибка(ИнформацияОбОшибке, СтандартнаяОбработка, ДополнительныеПараметры) Экспорт
	ДополнительныеПараметры.Вставить("ЗагруженныеДанные");
	ДополнительныеПараметры.Вставить("ИнформацияОбОшибке", ИнформацияОбОшибке);
	ВыполнитьПродолжение(ДополнительныеПараметры);
КонецПроцедуры

&НаКлиенте
Процедура ПакетЗапросов_ЗагрузитьЗавершение(ДополнительныеПараметры) Экспорт

	стрЗагруженныеДанные = ДополнительныеПараметры.Чтение.ПолучитьТекст();

	стЗагруженныеДанные = ПакетЗапросов_ЗагрузитьНаСервере(стрЗагруженныеДанные);

	фОК = Истина;
	фОК = фОК И стЗагруженныеДанные.Свойство("Формат");
	фОК = фОК И стЗагруженныеДанные.Формат = СигнатураКонсоли;
	фОК = фОК И стЗагруженныеДанные.Свойство("Версия");

	Если Не фОК Тогда
		ОшибкаКонсоли("Не верный формат файла!");
	КонецЕсли;

	Если стЗагруженныеДанные.Версия > ВерсияФормата Тогда
		ОшибкаКонсоли("Используется более новая версия формата. Обновите консоль запросов!");
	КонецЕсли;
	
	//Сохраняемые состояния - структура, предназначена для сохранения значений, которых нет в опциях (состояния флажков форм,
	//разных значений, и т.д.). Записывается в файл. Из файла читается только при первом открытии.
	Если Не ЗначениеЗаполнено(Объект.СохраняемыеСостояния) Тогда
		Если стЗагруженныеДанные.Версия >= 11 Тогда
			Объект.СохраняемыеСостояния = стЗагруженныеДанные.СохраняемыеСостояния;
		Иначе
			Объект.СохраняемыеСостояния = Новый Структура;
		КонецЕсли;
	КонецЕсли;

	Если Не стЗагруженныеДанные.Свойство("ПакетЗапросов") Тогда
		ДополнительныеПараметры.Вставить("ЗагруженныеДанные", стЗагруженныеДанные);
		ВыполнитьПродолжение(ДополнительныеПараметры);
		Возврат;
	КонецЕсли;

	Если стЗагруженныеДанные.Версия >= 2 Тогда
		стОпции = стЗагруженныеДанные.Опции;
		ОпцияСохранятьКомментарии = стОпции.ОпцияСохранятьКомментарии;
	Иначе
		ОпцияСохранятьКомментарии = Истина;
	КонецЕсли;

	Если стЗагруженныеДанные.Версия >= 3 Тогда
		ОпцияИнтервалАвтосохранения = стОпции.ОпцияИнтервалАвтосохранения;
	Иначе
		ОпцияИнтервалАвтосохранения = 60;
	КонецЕсли;

	Если стЗагруженныеДанные.Версия >= 6 Тогда
		ОпцияАвтосохранениеПередВыполнениемЗапроса = стОпции.ОпцияАвтосохранениеПередВыполнениемЗапроса;
	Иначе
		ОпцияАвтосохранениеПередВыполнениемЗапроса = Истина;
	КонецЕсли;

	Если стЗагруженныеДанные.Версия >= 8 Тогда
		Объект.ОпцияОбрабатывать__ = стОпции.ОпцияОбрабатывать__;
	Иначе
		Объект.ОпцияОбрабатывать__ = Истина;
	КонецЕсли;

	Если стЗагруженныеДанные.Версия >= 10 Тогда
		Объект.ОпцияИнтервалОбновленияВыполненияАлгоритма = стОпции.ОпцияИнтервалОбновленияВыполненияАлгоритма;
	Иначе
		Объект.ОпцияИнтервалОбновленияВыполненияАлгоритма = 1000;
	КонецЕсли;

	Если стЗагруженныеДанные.Версия >= 12 Тогда
		ОпцияПериодОпросаВключенияВыключенияТехнологическогоЖурнала = стОпции.ОпцияПериодОпросаВключенияВыключенияТехнологическогоЖурнала;
	Иначе
		ОпцияПериодОпросаВключенияВыключенияТехнологическогоЖурнала = 3;
	КонецЕсли;

	Если стЗагруженныеДанные.Версия >= 13 Тогда
		ИмяТекущегоЗапроса = стЗагруженныеДанные.ТекущийЗапрос;
	Иначе
		ИмяТекущегоЗапроса = Неопределено;
	КонецЕсли;

	КоличествоЗапросов = стЗагруженныеДанные.КоличествоЗапросов;

	Если Не ДополнительныеПараметры.Свойство("Добавление") Тогда
		ПакетЗапросов.ПолучитьЭлементы().Очистить();
	КонецЕсли;
	
	ПакетЗапросов_ДобавитьСтрокиИзМассива(ПакетЗапросов, стЗагруженныеДанные.ПакетЗапросов);

	Для Каждого ЭлементПакета Из ПакетЗапросов.ПолучитьЭлементы() Цикл
		Элементы.ПакетЗапросов.Развернуть(ЭлементПакета.ПолучитьИдентификатор(), Истина);
	КонецЦикла;

	ПакетЗапросов_Инициализировать();

	ТекущаяСтрока = ПакетЗапросов_НайтиПоИмени(ИмяТекущегоЗапроса);
	Если ТекущаяСтрока <> Неопределено
		И Элементы.ПакетЗапросов.ТекущаяСтрока <> ТекущаяСтрока Тогда
		Элементы.ПакетЗапросов.ТекущаяСтрока = ТекущаяСтрока;
	КонецЕсли;

	Модифицированность = Ложь;

	ВосстановлениеПозицииРедактирования();

	ДополнительныеПараметры.Вставить("ЗагруженныеДанные", стЗагруженныеДанные);
	ВыполнитьПродолжение(ДополнительныеПараметры);

КонецПроцедуры

Функция ПакетЗапросов_НайтиПоИмени(ИмяЗапроса, Знач Узел = Неопределено)

	Если Узел = Неопределено Тогда
		Узел = ПакетЗапросов;
	КонецЕсли;

	Для Каждого Строка Из Узел.ПолучитьЭлементы() Цикл

		Если Строка.Имя = ИмяЗапроса Тогда
			Возврат Строка.ПолучитьИдентификатор();
		КонецЕсли;

		ъ = ПакетЗапросов_НайтиПоИмени(ИмяЗапроса, Строка);
		Если ъ <> Неопределено Тогда
			Возврат ъ;
		КонецЕсли;

	КонецЦикла;

	Возврат Неопределено;

КонецФункции

#КонецОбласти

#Область Запрос

&НаКлиенте
Функция Запрос_ПолучитьДанныеЗапроса(идЗапрос)

	Если идЗапрос = Неопределено Тогда
		Возврат Новый Структура("Имя, Запрос, ТекстКод, МетодИсполненияКода, Параметры, ВКонструкторе, КурсорНачалоСтроки, КурсорНачалоКолонки, КурсорКонецСтроки, КурсорКонецКолонки, КодКурсорНачалоСтроки, КодКурсорНачалоКолонки, КодКурсорКонецСтроки, КодКурсорКонецКолонки, ЗапросОригинальный, ТекстКодОригинальный",
			"", "", "", 2, Неопределено, Ложь, 1, 1, 1, 1, 1, 1, 1, 1,"","");
	КонецЕсли;

	СтрокаЗапроса = ПакетЗапросов.НайтиПоИдентификатору(идЗапрос);
	Возврат Новый Структура("Имя, Запрос, ТекстКод, МетодИсполненияКода, Параметры, ВременныеТаблицы, 
	|ВКонструкторе, КурсорНачалоСтроки, КурсорНачалоКолонки, КурсорКонецСтроки, КурсорКонецКолонки, 
	|КодКурсорНачалоСтроки, КодКурсорНачалоКолонки, КодКурсорКонецСтроки, КодКурсорКонецКолонки, 
	|ЗапросОригинальный, ТекстКодОригинальный,АлгоритмПередВыполнением,АлгоритмПередВыполнениемОригинальный",
		СтрокаЗапроса.Имя, СтрокаЗапроса.ТекстЗапроса, СтрокаЗапроса.ТекстКод, СтрокаЗапроса.МетодИсполненияКода,
		СтрокаЗапроса.ПараметрыЗапроса, СтрокаЗапроса.ВременныеТаблицы, СтрокаЗапроса.ВКонструкторе,
		СтрокаЗапроса.КурсорНачалоСтроки + 1, СтрокаЗапроса.КурсорНачалоКолонки + 1, СтрокаЗапроса.КурсорКонецСтроки
		+ 1, СтрокаЗапроса.КурсорКонецКолонки + 1, СтрокаЗапроса.КодКурсорНачалоСтроки + 1,
		СтрокаЗапроса.КодКурсорНачалоКолонки + 1, СтрокаЗапроса.КодКурсорКонецСтроки + 1,
		СтрокаЗапроса.КодКурсорКонецКолонки + 1, СтрокаЗапроса.ТекстЗапросаОригинальный, СтрокаЗапроса.ТекстКодОригинальный,
		СтрокаЗапроса.АлгоритмПередВыполнением, СтрокаЗапроса.АлгоритмПередВыполнениемОригинальный);

КонецФункции

&НаКлиенте
Процедура Запрос_ПоместитьДанныеЗапроса(идЗапрос, стрТекстЗапроса, стрТекстКод = Неопределено,
	МетодИсполненияКода = Неопределено, сзПараметрыЗапроса = Неопределено, сзВременныеТаблицы = Неопределено,
	КурсорНачалоСтроки = Неопределено, КурсорНачалоКолонки = Неопределено, КурсорКонецСтроки = Неопределено,
	КурсорКонецКолонки = Неопределено, КодКурсорНачалоСтроки = Неопределено, КодКурсорНачалоКолонки = Неопределено,
	КодКурсорКонецСтроки = Неопределено, КодКурсорКонецКолонки = Неопределено,АлгоритмПередВыполнением = Неопределено)

	СтрокаЗапроса = ПакетЗапросов.НайтиПоИдентификатору(идЗапрос);
	Если СтрокаЗапроса = Неопределено Тогда
		Возврат;
	КонецЕсли;

	СтрокаЗапроса.ТекстЗапроса = стрТекстЗапроса;

	Если стрТекстКод <> Неопределено Тогда
		СтрокаЗапроса.ТекстКод = стрТекстКод;
	КонецЕсли;

	Если сзПараметрыЗапроса <> Неопределено Тогда
		СтрокаЗапроса.ПараметрыЗапроса = сзПараметрыЗапроса;
	КонецЕсли;

	Если сзВременныеТаблицы <> Неопределено Тогда
		СтрокаЗапроса.ВременныеТаблицы = сзВременныеТаблицы;
	КонецЕсли;

	Если МетодИсполненияКода <> Неопределено Тогда
		СтрокаЗапроса.МетодИсполненияКода = МетодИсполненияКода;
	КонецЕсли;

	Если КурсорНачалоСтроки <> Неопределено Тогда
		СтрокаЗапроса.КурсорНачалоСтроки = КурсорНачалоСтроки - 1;
	КонецЕсли;

	Если КурсорНачалоКолонки <> Неопределено Тогда
		СтрокаЗапроса.КурсорНачалоКолонки = КурсорНачалоКолонки - 1;
	КонецЕсли;

	Если КурсорКонецСтроки <> Неопределено Тогда
		СтрокаЗапроса.КурсорКонецСтроки = КурсорКонецСтроки - 1;
	КонецЕсли;

	Если КурсорКонецКолонки <> Неопределено Тогда
		СтрокаЗапроса.КурсорКонецКолонки = КурсорКонецКолонки - 1;
	КонецЕсли;

	Если КодКурсорНачалоСтроки <> Неопределено Тогда
		СтрокаЗапроса.КодКурсорНачалоСтроки = КодКурсорНачалоСтроки - 1;
	КонецЕсли;

	Если КодКурсорНачалоКолонки <> Неопределено Тогда
		СтрокаЗапроса.КодКурсорНачалоКолонки = КодКурсорНачалоКолонки - 1;
	КонецЕсли;

	Если КодКурсорКонецСтроки <> Неопределено Тогда
		СтрокаЗапроса.КодКурсорКонецСтроки = КодКурсорКонецСтроки - 1;
	КонецЕсли;

	Если КодКурсорКонецКолонки <> Неопределено Тогда
		СтрокаЗапроса.КодКурсорКонецКолонки = КодКурсорКонецКолонки - 1;
	КонецЕсли;

	Если АлгоритмПередВыполнением <> Неопределено Тогда
		СтрокаЗапроса.АлгоритмПередВыполнением = АлгоритмПередВыполнением;
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура Запрос_УстановитьВКонструкторе(идЗапрос, фВКонструкторе)
	ПакетЗапросов.НайтиПоИдентификатору(идЗапрос).ВКонструкторе = фВКонструкторе;
КонецПроцедуры

&НаКлиенте
Функция Запрос_ПолучитьВКонструкторе(идЗапрос)
	Возврат ПакетЗапросов.НайтиПоИдентификатору(идЗапрос).ВКонструкторе;
КонецФункции

#КонецОбласти

#Область ОбработкаКомментариевЗапроса

&НаКлиенте
Процедура КомментарииЗапроса_СохранитьДанныеИсходногоЗапроса(стрТекстЗапроса)

	Если Не ОпцияСохранятьКомментарии Тогда
		Возврат;
	КонецЕсли;

	ДанныеКомментариев = стрТекстЗапроса;

КонецПроцедуры

&НаКлиенте
Функция КомментарииЗапроса_СтрокаБезКомментариев(стр)

	чПозицияКомментария = Найти(стр, "//");

	Если чПозицияКомментария = 0 Тогда
		Возврат стр;
	КонецЕсли;

	Возврат Лев(стр, чПозицияКомментария - 1);

КонецФункции

&НаКлиенте
Функция КомментарииЗапроса_КомментарийСтроки(стр)

	чПозицияКомментария = Найти(стр, "//");

	Если чПозицияКомментария = 0 Тогда
		Возврат "";
	КонецЕсли;

	Возврат Прав(стр, СтрДлина(стр) - чПозицияКомментария + 1);

КонецФункции

&НаКлиенте
Процедура КомментарииЗапроса_Восстановить(стрТекстЗапроса)

	Если Не ОпцияСохранятьКомментарии Тогда
		Возврат;
	КонецЕсли;

	чГлубинаПоиска = 50;

	ИсходныйЗапрос = Новый ТекстовыйДокумент;
	ИсходныйЗапросУпр = Новый Массив;
	НовыйЗапрос = Новый ТекстовыйДокумент;
	РезультатЗапрос = Новый ТекстовыйДокумент;
	ИсходныйЗапрос.УстановитьТекст(ДанныеКомментариев);
	НовыйЗапрос.УстановитьТекст(стрТекстЗапроса);
	чКоличествоСтрокНового = НовыйЗапрос.КоличествоСтрок();
	чКоличествоСтрокИсходного = ИсходныйЗапрос.КоличествоСтрок();

	Для й = 1 По чКоличествоСтрокИсходного Цикл
		ИсходныйЗапросУпр.Добавить(ВРег(СокрЛП(КомментарииЗапроса_СтрокаБезКомментариев(ИсходныйЗапрос.ПолучитьСтроку(
			й)))));
	КонецЦикла;

	чСтрокаИсходного = 1;
	чСтрокаНового = 1;
	
	//начальные комментарии переносим до поиска
	Пока чСтрокаИсходного <= чКоличествоСтрокИсходного Цикл
		стрИсходного = ИсходныйЗапрос.ПолучитьСтроку(чСтрокаИсходного);
		Если Лев(СокрЛП(стрИсходного), 2) = "//" Тогда
			РезультатЗапрос.ДобавитьСтроку(стрИсходного);
		Иначе
			Прервать;
		КонецЕсли;
		чСтрокаИсходного = чСтрокаИсходного + 1;
	КонецЦикла;

	Пока чСтрокаНового <= чКоличествоСтрокНового Цикл

		стрНового = НовыйЗапрос.ПолучитьСтроку(чСтрокаНового);

		чНайденнаяСтрокаИсходного = 0;
		Если ЗначениеЗаполнено(стрНового) Тогда
			чСтрокИскать = ?(чСтрокаИсходного + чГлубинаПоиска < чКоличествоСтрокИсходного, чГлубинаПоиска,
				чКоличествоСтрокИсходного - чСтрокаИсходного);
			стрНовогоУпр = ВРег(СокрЛП(стрНового));
			Для й = чСтрокаИсходного По чСтрокаИсходного + чСтрокИскать Цикл
				Если стрНовогоУпр = ИсходныйЗапросУпр[й - 1] Тогда
					чНайденнаяСтрокаИсходного = й;
					Прервать;
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;

		Если чНайденнаяСтрокаИсходного > 0 Тогда

			Для й = 0 По чНайденнаяСтрокаИсходного - чСтрокаИсходного - 1 Цикл

				стрИсходного = ИсходныйЗапрос.ПолучитьСтроку(чСтрокаИсходного + й);

				Если Лев(СокрЛ(стрИсходного), 2) = "//" Тогда
					Если Не ПустаяСтрока(СтрЗаменить(стрИсходного, "/", "")) Тогда
						РезультатЗапрос.ДобавитьСтроку(стрИсходного);
					КонецЕсли;
					Продолжить;
				КонецЕсли;

				Если ЗначениеЗаполнено(КомментарииЗапроса_КомментарийСтроки(стрИсходного)) Тогда
					Если Лев(СокрЛП(стрИсходного), 2) = "//" Тогда
						РезультатЗапрос.ДобавитьСтроку(стрИсходного);
					Иначе
						РезультатЗапрос.ДобавитьСтроку("//" + стрИсходного);
					КонецЕсли;
				КонецЕсли;

			КонецЦикла;

			стрКомментарий = КомментарииЗапроса_КомментарийСтроки(ИсходныйЗапрос.ПолучитьСтроку(
				чНайденнаяСтрокаИсходного));
			РезультатЗапрос.ДобавитьСтроку(стрНового + стрКомментарий);
			чСтрокаИсходного = чНайденнаяСтрокаИсходного + 1;

		Иначе
			РезультатЗапрос.ДобавитьСтроку(стрНового);
		КонецЕсли;

		чСтрокаНового = чСтрокаНового + 1;

	КонецЦикла;
	
	//теперь все что осталось из исходного
	Для й = чСтрокаИсходного По чКоличествоСтрокИсходного Цикл
		стрИсходного = ИсходныйЗапрос.ПолучитьСтроку(й);
		Если ЗначениеЗаполнено(КомментарииЗапроса_КомментарийСтроки(стрИсходного)) Тогда
			Если Лев(СокрЛП(стрИсходного), 2) = "//" Тогда
				РезультатЗапрос.ДобавитьСтроку(стрИсходного);
			Иначе
				РезультатЗапрос.ДобавитьСтроку("//" + стрИсходного);
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;

	стрТекстЗапроса = РезультатЗапрос.ПолучитьТекст();

КонецПроцедуры

#КонецОбласти

#Область ОбработкаПараметровВТекстеЗапроса

&НаКлиенте
Функция ПолучитьСимволыКонцаПараметра()
	Возврат ",+-*/<>=) " + Символы.ПС + Символы.ВК + Символы.Таб;
КонецФункции

&НаКлиенте
Функция ЕстьПараметр(стрТекстЗапроса, стрИмяПараметра)

	стрСимволыКонцаПараметра = ПолучитьСимволыКонцаПараметра();
	чДлиннаПараметра = СтрДлина(стрИмяПараметра);
	чДлиннаТекста = СтрДлина(стрТекстЗапроса);
	п = 1;
	Пока п <= чДлиннаТекста Цикл
		п = СтрНайти(стрТекстЗапроса, стрИмяПараметра, , п);
		Если п = 0 Тогда
			Прервать;
		КонецЕсли;
		с = Сред(стрТекстЗапроса, п + чДлиннаПараметра, 1);
		Если с = "" Или Найти(стрСимволыКонцаПараметра, с) > 0 Тогда
			Возврат Истина;
		КонецЕсли;
		п = п + чДлиннаПараметра;
	КонецЦикла;

	Возврат Ложь;

КонецФункции

&НаКлиенте
Функция ЗаменитьПараметр(стрТекстЗапроса, стрСтароеИмяПараметра, стрНовоеИмяПараметра)

	стрСимволыКонцаПараметра = ПолучитьСимволыКонцаПараметра();
	чДлиннаПараметра = СтрДлина(стрСтароеИмяПараметра);
	чДлиннаТекста = СтрДлина(стрТекстЗапроса);
	маЧасти = Новый Массив;
	п = 1;
	Пока п <= чДлиннаТекста Цикл
		п1 = СтрНайти(стрТекстЗапроса, стрСтароеИмяПараметра, , п);
		Если п1 = 0 Тогда
			маЧасти.Добавить(Сред(стрТекстЗапроса, п));
			Прервать;
		КонецЕсли;
		с = Сред(стрТекстЗапроса, п1 + чДлиннаПараметра, 1);
		Если с = "" Или Найти(стрСимволыКонцаПараметра, с) > 0 Тогда
			маЧасти.Добавить(Сред(стрТекстЗапроса, п, п1 - п));
			маЧасти.Добавить(стрНовоеИмяПараметра);
		Иначе
			маЧасти.Добавить(Сред(стрТекстЗапроса, п, п1 - п + чДлиннаПараметра));
		КонецЕсли;
		п = п1 + чДлиннаПараметра;
	КонецЦикла;

	Возврат СтрСоединить(маЧасти);

КонецФункции

#КонецОбласти

#Область СобытияЭлементовФормы

&НаКлиенте
Процедура ИзменитьИмяПараметраВТекстеЗапроса(РезультатВопроса, ДополнительныеПараметры) Экспорт
	Если РезультатВопроса = КодВозвратаДиалога.Да Тогда
		УстановитьТекстЗапроса(ЗаменитьПараметр(ТекущийТекстЗапроса(), "&" + ДополнительныеПараметры.СтароеЗначениеИмяПараметра, "&"
			+ ДополнительныеПараметры.ИмяПараметра));
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ОбработатьИзменениеИмениПараметра(НоваяСтрока, ОтменаРедактирования, Отказ)

	Если ОтменаРедактирования Тогда
		Возврат;
	КонецЕсли;

	стрИмяПараметра = Элементы.ПараметрыЗапроса.ТекущиеДанные.Имя;
	Если ЗначениеЗаполнено(стрИмяПараметра) И стрИмяПараметра = СтароеЗначениеИмяПараметра Тогда
		Возврат;
	КонецЕсли;

	Если Не ИмяКорректно(стрИмяПараметра) Тогда
		ПоказатьПредупреждениеКонсоли(
			"Неверное имя параметра! Имя должно состоять из одного слова, начинаться с буквы и не содержать специальных символов кроме ""_"".");
		Отказ = Истина;
		Возврат;
	КонецЕсли;

	Если Не НоваяСтрока И ЗначениеЗаполнено(СтароеЗначениеИмяПараметра) Тогда
		стрТекстЗапроса = ТекущийТекстЗапроса();
		Если ЕстьПараметр(стрТекстЗапроса, "&" + СтароеЗначениеИмяПараметра) Тогда
			ДополнительныеПараметры = Новый Структура("СтароеЗначениеИмяПараметра, ИмяПараметра",
				СтароеЗначениеИмяПараметра, стрИмяПараметра);
			ПоказатьВопрос(
				Новый ОписаниеОповещения("ИзменитьИмяПараметраВТекстеЗапроса", ЭтаФорма, ДополнительныеПараметры),
				"Запрос содержит изменяемое мия параметра. Изменить имя параметра в тексте запроса?",
				РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да);
		КонецЕсли;
	КонецЕсли;

КонецПроцедуры





//&НаКлиенте
//Процедура ПараметрыЗапросаПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
//КонецПроцедуры










&НаКлиенте
Процедура УстановитьПараметрыВводаЗначения()

	ТекущиеДанные = Элементы.ПараметрыЗапроса.ТекущиеДанные;

	Если ТекущиеДанные <> Неопределено Тогда

		Элементы.ПараметрыЗапросаЗначение.КартинкаКнопкиВыбора = Новый Картинка;

		Если ЗначениеЗаполнено(ТекущиеДанные.ТипКонтейнера) Тогда

			Элементы.ПараметрыЗапросаЗначение.КнопкаОчистки = Ложь;
			Элементы.ПараметрыЗапросаЗначение.КнопкаВыбора = Истина;
			Элементы.ПараметрыЗапросаЗначение.ВыбиратьТип = Ложь;
			Элементы.ПараметрыЗапросаЗначение.РедактированиеТекста = Ложь;
			Элементы.ПараметрыЗапросаЗначение.ОграничениеТипа = Новый ОписаниеТипов("Строка");
			Элементы.ПараметрыЗапросаЗначение.КартинкаКнопкиВыбора = БиблиотекаКартинок.Изменить;

		ИначеЕсли ТипЗнч(ТекущиеДанные.Контейнер) = Тип("Структура") Тогда

			Элементы.ПараметрыЗапросаЗначение.КнопкаОчистки = Ложь;
			Элементы.ПараметрыЗапросаЗначение.КнопкаВыбора = Истина;
			Элементы.ПараметрыЗапросаЗначение.ВыбиратьТип = Ложь;
			Элементы.ПараметрыЗапросаЗначение.КартинкаКнопкиВыбора = БиблиотекаКартинок.Изменить;
			Элементы.ПараметрыЗапросаЗначение.РедактированиеТекста = Ложь;
			Элементы.ПараметрыЗапросаЗначение.ОграничениеТипа = Новый ОписаниеТипов("Строка");

		Иначе

			Элементы.ПараметрыЗапросаЗначение.РедактированиеТекста = Истина;
			Если ЗначениеЗаполнено(ТекущиеДанные.ТипЗначения) Тогда
				Элементы.ПараметрыЗапросаЗначение.ОграничениеТипа = ТекущиеДанные.ТипЗначения;
			Иначе
				Элементы.ПараметрыЗапросаЗначение.ОграничениеТипа = Новый ОписаниеТипов;
			КонецЕсли;

			Если ТекущиеДанные.Значение = Неопределено
				И Элементы.ПараметрыЗапросаЗначение.ОграничениеТипа.Типы().Количество() > 1 Тогда

				Элементы.ПараметрыЗапросаЗначение.ВыбиратьТип = Истина;
				Элементы.ПараметрыЗапросаЗначение.КнопкаВыбора = Истина;
				Элементы.ПараметрыЗапросаЗначение.КнопкаОчистки = Ложь;
				Элементы.ПараметрыЗапросаЗначение.КартинкаКнопкиВыбора = Элементы.Картинка_ВыборТипа.Картинка;

			Иначе

				Элементы.ПараметрыЗапросаЗначение.ВыбиратьТип = Ложь;
				Элементы.ПараметрыЗапросаЗначение.КнопкаОчистки = Истина;
				Элементы.ПараметрыЗапросаЗначение.КнопкаВыбора = НужнаКнопкаВыбораЗначению(ТекущиеДанные.Значение);

			КонецЕсли;

		КонецЕсли;

	КонецЕсли;

КонецПроцедуры



&НаКлиенте
Функция ДобавитьПараметрСКонтролемИмени(ИмяПараметра)

	стрИспользуемоеИмяПараметра = ИмяПараметра;
	й = 1;
	Пока Истина Цикл

		маЪ = ПараметрыЗапроса.НайтиСтроки(Новый Структура("Имя", стрИспользуемоеИмяПараметра));
		Если маЪ.Количество() = 0 Тогда
			Прервать;
		КонецЕсли;

		стрИспользуемоеИмяПараметра = ИмяПараметра + й;
		й = й + 1;

	КонецЦикла;

	НоваяСтрока = ПараметрыЗапроса.Добавить();
	НоваяСтрока.Имя = стрИспользуемоеИмяПараметра;

	Возврат НоваяСтрока;

КонецФункции

&НаКлиенте
Процедура ОкончаниеРедактированияСтроки(РезультатЗакрытия, ДополнительныеПараметры) Экспорт

	Если РезультатЗакрытия = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если ДополнительныеПараметры.Поле = "Контейнер" Тогда
		Если ДополнительныеПараметры.Таблица = "ПараметрыЗапроса" Тогда
			ПараметрыЗапроса_СохранитьЗначение(ДополнительныеПараметры.Строка, РезультатЗакрытия.Значение);
		ИначеЕсли ДополнительныеПараметры.Таблица = "ВременныеТаблицы" Тогда
			СтрокаТаблицы = ВременныеТаблицы.НайтиПоИдентификатору(ДополнительныеПараметры.Строка);
			
			Контейнер = Новый Структура("Тип, КоличествоСтрок, Значение, Представление", "ТаблицаЗначений",
				РезультатЗакрытия.КоличествоСтрок, РезультатЗакрытия.Значение, РезультатЗакрытия.Представление);
			
			СтрокаТаблицы.Контейнер = Контейнер;
			СтрокаТаблицы.Значение = СтрокаТаблицы.Контейнер.Представление;
			Модифицированность = Истина;
		КонецЕсли;
	ИначеЕсли ДополнительныеПараметры.Поле = "КонтейнерКакТип" Тогда
		ПараметрыЗапроса_СохранитьЗначение(ДополнительныеПараметры.Строка, РезультатЗакрытия.ОписаниеКонтейнера);
	ИначеЕсли ДополнительныеПараметры.Поле = "ТипЗначения" Тогда

		ОписаниеКонтейнера = РезультатЗакрытия.ОписаниеКонтейнера;

		идСтрокаПараметра = ДополнительныеПараметры.Строка;
		Если идСтрокаПараметра = Неопределено Тогда
				//добавление нового параметра
			СтрокаПараметра = ДобавитьПараметрСКонтролемИмени(РезультатЗакрытия.ИмяПараметра);
			СтрокаПараметра.ТипКонтейнера = РезультатЗакрытия.ТипКонтейнера;
			идСтрокаПараметра = СтрокаПараметра.ПолучитьИдентификатор();
		КонецЕсли;

		ПараметрыЗапроса_УстановитьТип(идСтрокаПараметра, РезультатЗакрытия.ТипКонтейнера, ОписаниеКонтейнера);

		стрТекстЗапроса = Неопределено;
		Если РезультатЗакрытия.Свойство("ТекстЗапроса", стрТекстЗапроса) Тогда

			Если СтрокаПараметра <> Неопределено И СтрокаПараметра.Имя <> РезультатЗакрытия.ИмяПараметра Тогда
				стрТекстЗапроса = СтрЗаменить(стрТекстЗапроса, "&" + РезультатЗакрытия.ИмяПараметра, "&"
					+ СтрокаПараметра.Имя);
			КонецЕсли;

			чРазмерТекста = СтрДлина(ТекущийТекстЗапроса());
			УстановитьГраницыВыделенияЗапросаПоПозиции(чРазмерТекста + 1, чРазмерТекста + 1);
			ВставитьТекстПоПозицииКурсораЗапроса(стрТекстЗапроса);

			Элементы.ГруппаЗапросСтраницы.ТекущаяСтраница = Элементы.СтраницаЗапрос;
			ТекущийЭлемент = Элементы.ТекстЗапроса;

		КонецЕсли;

		УстановитьПараметрыВводаЗначения();

	ИначеЕсли ДополнительныеПараметры.Поле = "Значение" Тогда
		Элементы.ПараметрыЗапроса.ТекущиеДанные.Значение = РезультатЗакрытия.Значение;
		Элементы.ПараметрыЗапроса.ТекущиеДанные.Контейнер = РезультатЗакрытия.Значение;
		Модифицированность = Истина;
	КонецЕсли;


КонецПроцедуры










&НаКлиенте
Процедура РезультатВПакетеПриИзменении(Элемент)
	Если ИзвлечьРезультат(РезультатВПакете) > 0 Тогда
		СтруктураЗаписиРезультата_Развернуть();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура УстановитьСостоянияЭлементов()

	Элементы.ОпцияОграничениеВыводимыхСтрокПервые.Доступность = ОграничениеВыводимыхСтрокПервыеВкл;
	Элементы.ОпцияОграничениеВыводимыхСтрок.Доступность = ОграничениеВыводимыхСтрокВкл;

КонецПроцедуры





&НаКлиенте
Процедура ПараметрыЗапросаЗначениеОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)

	Если ТипЗнч(ВыбранноеЗначение) = Тип("Тип") Тогда
		ОграничениеТипа = Элементы.ПараметрыЗапросаЗначение.ОграничениеТипа;
		маТипы = Новый Массив;
		маТипы.Добавить(ВыбранноеЗначение);
		ТипЗначения = Новый ОписаниеТипов(маТипы, ОграничениеТипа.КвалификаторыЧисла,
			ОграничениеТипа.КвалификаторыСтроки, ОграничениеТипа.КвалификаторыДаты);
		Значение = ТипЗначения.ПривестиЗначение(Элементы.ПараметрыЗапроса.ТекущиеДанные.Значение);
		Элементы.ПараметрыЗапроса.ТекущиеДанные.Значение = Значение;
		СтандартнаяОбработка = Ложь;
	КонецЕсли;

	УстановитьПараметрыВводаЗначения();

КонецПроцедуры












&НаКлиенте
Функция СтруктураЗаписиРезультатаПолучитьТекстВставки(Строка)

	маТекстЗначения = Новый Массив;

	Строка = СтруктураЗаписиРезультата.НайтиПоИдентификатору(Строка);
	Пока Строка <> Неопределено Цикл
		маТекстЗначения.Вставить(0, Строка.Имя);
		Строка = Строка.ПолучитьРодителя();
	КонецЦикла;

	Возврат СтрСоединить(маТекстЗначения, ".");

КонецФункции






&НаКлиенте
Процедура ПакетРезультатаЗапросаОбработчикОжиданияПриАктивизацииСтроки()
	ТекущаяСтрока = Элементы.ПакетРезультатаЗапроса.ТекущаяСтрока;
	Если ТекущаяСтрока <> Неопределено Тогда
		Если ИзвлечьРезультат(ПакетРезультатаЗапроса.Индекс(ПакетРезультатаЗапроса.НайтиПоИдентификатору(
			ТекущаяСтрока)) + 1) > 0 Тогда
			СтруктураЗаписиРезультата_Развернуть();
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

#КонецОбласти

#Область ЗаполнениеИзПерехваченногоЗапроса

&НаСервере
Функция ЗаполнитьИзЧтениеXML(ЧтениеXML)
	Перем стрОшибка, стрТекстЗапроса, стПараметрыЗапроса;

	Обработка = РеквизитФормыВЗначение("Объект");

	Попытка

		СтруктураПараметров = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
		Если СтруктураПараметров.Количество() >= 2 Тогда
			стрТекстЗапроса = Неопределено;
			Если Не СтруктураПараметров.Свойство("Текст", стрТекстЗапроса) Или Не СтруктураПараметров.Свойство(
				"Параметры", стПараметрыЗапроса) Тогда
				стрОшибка = "Ошибка структуры.";
			КонецЕсли;
		Иначе
			стрОшибка = "Ошибка структуры.";
		КонецЕсли;

	Исключение
		стрОшибка = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
	КонецПопытки;

	ЧтениеXML.Закрыть();

	Если ЗначениеЗаполнено(стрОшибка) Тогда
		Возврат "Не возможно сформировать запрос - ошибка структуры введенного XML.
				|Техническая информация: " + стрОшибка;
	КонецЕсли;
	
	//Чтение параметров запроса
	ТекстЗапроса = стрТекстЗапроса;
	стОшибка = ПараметрыЗаполнитьИзЗапросаНаСервере(ТекстЗапроса);
	Если ЗначениеЗаполнено(стОшибка) Тогда
		Сообщить(
			"Не удалось получить параметры из текста запроса. Параметры будут заполнены только по объекту запроса("
			+ стОшибка.ОписаниеОшибки + ").", СтатусСообщения.Информация);
	КонецЕсли;

	Для Каждого кзПараметр Из стПараметрыЗапроса Цикл

		маСтрокиПараметра = ПараметрыЗапроса.НайтиСтроки(Новый Структура("Имя", кзПараметр.Ключ));
		Если маСтрокиПараметра.КОличество() > 0 Тогда
			СтрокаПараметра = маСтрокиПараметра[0];
		Иначе
			СтрокаПараметра = ПараметрыЗапроса.Добавить();
		КонецЕсли;

		СтрокаПараметра.Имя = кзПараметр.Ключ;
		СтрокаПараметра.ТипКонтейнера = ПолучитьКодФормыЗначения(кзПараметр.Значение);

		ТипЗначенияИзЗапроса = СтрокаПараметра.ТипЗначения;

		Если СтрокаПараметра.ТипКонтейнера = 0 Тогда
			ТипЗначения = ТипЗнч(кзПараметр.Значение);
		ИначеЕсли СтрокаПараметра.ТипКонтейнера = 1 Тогда
			ТипЗначения = кзПараметр.Значение.ТипЗначения;
		ИначеЕсли СтрокаПараметра.ТипКонтейнера = 2 И кзПараметр.Значение.Количество() > 0 Тогда
			ТипЗначения = ТипЗнч(кзПараметр.Значение[0]);
		Иначе
			ТипЗначения = Неопределено;
		КонецЕсли;

		Если ЗначениеЗаполнено(ТипЗначения) И (Не ЗначениеЗаполнено(ТипЗначенияИзЗапроса) Или (ТипЗнч(ТипЗначения)
			= Тип("Тип") И Не ТипЗначенияИзЗапроса.СодержитТип(ТипЗначения))) Тогда
			Если ТипЗнч(ТипЗначения) = Тип("Тип") Тогда
				СтрокаПараметра.ТипЗначения = ОписаниеТиповПоТипу(ТипЗначения);
			Иначе
				СтрокаПараметра.ТипЗначения = ТипЗначения;
			КонецЕсли;
		КонецЕсли;

		ПараметрыЗапроса_СохранитьЗначение(СтрокаПараметра.ПолучитьИдентификатор(), кзПараметр.Значение);

	КонецЦикла;
	
	//Чтение временных таблиц.
	маТаблицы = Неопределено;
	Если СтруктураПараметров.Свойство("ВременныеТаблицы", маТаблицы) Тогда

		Для Каждого стТаблица Из маТаблицы Цикл

			тзТаблица = стТаблица.Таблица;

			стНовыеТипыКолонок = Новый Структура;
			Для Каждого Колонка Из тзТаблица.Колонки Цикл

				маТипы = Колонка.ТипЗначения.Типы();
				маНовыеТипыКолонок = Новый Массив;
				фЕстьНеизвестныйОбъект = Ложь;
				Для Каждого Тип Из маТипы Цикл
					Если Строка(Тип) <> "НеизвестныйОбъект" Тогда
						маНовыеТипыКолонок.Добавить(Тип);
					Иначе
						фЕстьНеизвестныйОбъект = Истина;
					КонецЕсли;
				КонецЦикла;

				Если фЕстьНеизвестныйОбъект Тогда

					НовыйТипКолонки = Новый ОписаниеТипов(маНовыеТипыКолонок, Колонка.ТипЗначения.КвалификаторыЧисла,
						Колонка.ТипЗначения.КвалификаторыСтроки, Колонка.ТипЗначения.КвалификаторыДаты,
						Колонка.ТипЗначения.КвалификаторыДвоичныхДанных);

					стНовыеТипыКолонок.Вставить(Колонка.Имя, НовыйТипКолонки);

				КонецЕсли;

			КонецЦикла;

			Для Каждого кз Из стНовыеТипыКолонок Цикл
				Обработка.ИзменитьТипКолонкиТаблицыЗначений(тзТаблица, кз.Ключ, кз.Значение);
			КонецЦикла;

			СтрокаТаблицы = ВременныеТаблицы.Добавить();
			СтрокаТаблицы.Имя = стТаблица.Имя;
			СтрокаТаблицы.Контейнер = РеквизитФормыВЗначение("Объект").Контейнер_СохранитьЗначение(тзТаблица);
			СтрокаТаблицы.Значение = СтрокаТаблицы.Контейнер.Представление;

		КонецЦикла;

	КонецЕсли;

КонецФункции

&НаСервере
Процедура ЗаполнитьИзФайла(стрИмяФайла)
	ЧтениеXML = Новый ЧтениеXML;
	ЧтениеXML.ОткрытьФайл(стрИмяФайла);
	ЗаполнитьИзЧтениеXML(ЧтениеXML);
КонецПроцедуры

&НаСервере
Функция ЗаполнитьИзXMLНаСервере(ТекущийТекстЗапроса)

	стрСигнатураЗапросаВСтроке = "<Structure xmlns=""http://v8.1c.ru/8.1/data/core""";
	стрТекстВОкнеЗапроса = ТекущийТекстЗапроса;
	Если Лев(стрТекстВОкнеЗапроса, СтрДлина(стрСигнатураЗапросаВСтроке)) <> стрСигнатураЗапросаВСтроке Тогда
		Возврат "В поле текста запроса должна быть строка, кодирующая запрос с параметрами. Подробности на закладке ""Информация"".";
	КонецЕсли;

	ЧтениеXML = Новый ЧтениеXML;
	ЧтениеXML.УстановитьСтроку(стрТекстВОкнеЗапроса);

	ЗаполнитьИзЧтениеXML(ЧтениеXML);

КонецФункции

#КонецОбласти

#Область ИнтерактивныеКоманды

&НаКлиенте
Процедура ЗагрузитьПакетЗапросов(ДополнительныеПараметры = Неопределено) Экспорт

	Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	Диалог.Фильтр = ФильтрСохранения;

	ОписаниеОповещения = Новый ОписаниеОповещения("ПослеВыбораФайлаДляЗагрузкиПакетаЗапросов", ЭтаФорма, ДополнительныеПараметры);
	Диалог.Показать(ОписаниеОповещения);

КонецПроцедуры

&НаКлиенте
Процедура ПослеВыбораФайлаДляЗагрузкиПакетаЗапросов(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт

	Если ВыбранныеФайлы = Неопределено Тогда
		Возврат;
	КонецЕсли;

	стрИмяФайла = ВыбранныеФайлы[0];

	Если ДополнительныеПараметры = Неопределено Тогда
		ДополнительныеПараметры = Новый Структура;
	КонецЕсли;
		
	ДополнительныеПараметры.Вставить("Продолжение", "ПослеВыбораФайлаДляЗагрузкиПакетаЗапросовЗавершение");
	ДополнительныеПараметры.Вставить("ИмяФайла", стрИмяФайла);
			
	ПакетЗапросов_Загрузить(ДополнительныеПараметры);

КонецПроцедуры

&НаКлиенте
Процедура ПослеВопросаСохранения(РезультатВопроса, ДополнительныеПараметры) Экспорт

	Если ДополнительныеПараметры = "Загрузка" Тогда
		ЗагрузитьПакетЗапросовПослеВопроса(РезультатВопроса, ДополнительныеПараметры);
	ИначеЕсли ДополнительныеПараметры = "Завершение" Тогда
		ЗавершениеПослеВопроса(РезультатВопроса, ДополнительныеПараметры);
	ИначеЕсли ДополнительныеПараметры = "Новый" Тогда
		НовыйПакетЗапросовПослеВопроса(РезультатВопроса, ДополнительныеПараметры);
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ЗагрузитьПакетЗапросовПослеВопроса(РезультатВопроса, ДополнительныеПараметры)

	Если РезультатВопроса = КодВозвратаДиалога.Да Тогда
		СохранитьПакетЗапросов(Новый Структура);
		ЗагрузитьПакетЗапросов();
	ИначеЕсли РезультатВопроса = КодВозвратаДиалога.Нет Тогда

		ФлагУдаленФайлАвтосохранения = Ложь;
		ФлагУдаленФайлСостояния = Ложь;

		ДополнительныеПараметры = Новый Структура("ТипФайла, Продолжение", "Автосохранение", "ЗагрузитьПакетЗапросов");
		ОписаниеОповещения = Новый ОписаниеОповещения("Завершить_ПослеУдаления", ЭтаФорма, ДополнительныеПараметры);
		НачатьУдалениеФайлов(ОписаниеОповещения, ПолучитьИмяФайлаАвтосохранения(ИмяФайлаЗапросов));

		ДополнительныеПараметры = Новый Структура("ТипФайла, Продолжение", "Состояние", "ЗагрузитьПакетЗапросов");
		ОписаниеОповещения = Новый ОписаниеОповещения("Завершить_ПослеУдаления", ЭтаФорма, ДополнительныеПараметры);
		НачатьУдалениеФайлов(ОписаниеОповещения, ИмяФайлаАвтосохраненияСостояния);

	ИначеЕсли РезультатВопроса = КодВозвратаДиалога.Отмена Тогда
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура Завершить_ПослеУдаления(ДополнительныеПараметры) Экспорт

	Если ДополнительныеПараметры.ТипФайла = "Автосохранение" Тогда
		ФлагУдаленФайлАвтосохранения = Истина;
	ИначеЕсли ДополнительныеПараметры.ТипФайла = "Состояние" Тогда
		ФлагУдаленФайлСостояния = Истина;
	КонецЕсли;

	Если ФлагУдаленФайлАвтосохранения И ФлагУдаленФайлСостояния Тогда
		ВыполнитьПродолжение(ДополнительныеПараметры);
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура НовыйПакетЗапросовПослеВопроса(РезультатВопроса, ДополнительныеПараметры)

	Если РезультатВопроса = КодВозвратаДиалога.Да Тогда
		СохранитьПакетЗапросов(Новый Структура("Новый", Истина));
	ИначеЕсли РезультатВопроса = КодВозвратаДиалога.Нет Тогда

		ФлагУдаленФайлАвтосохранения = Ложь;
		ФлагУдаленФайлСостояния = Ложь;

		ДополнительныеПараметры = Новый Структура("ТипФайла, Продолжение", "Автосохранение",
			"ПродолжениеПакетЗапросов_Новый");
		ОписаниеОповещения = Новый ОписаниеОповещения("Завершить_ПослеУдаления", ЭтаФорма, ДополнительныеПараметры);
		НачатьУдалениеФайлов(ОписаниеОповещения, ПолучитьИмяФайлаАвтосохранения(ИмяФайлаЗапросов));

		ДополнительныеПараметры = Новый Структура("ТипФайла, Продолжение", "Состояние",
			"ПродолжениеПакетЗапросов_Новый");
		ОписаниеОповещения = Новый ОписаниеОповещения("Завершить_ПослеУдаления", ЭтаФорма, ДополнительныеПараметры);
		НачатьУдалениеФайлов(ОписаниеОповещения, ИмяФайлаАвтосохраненияСостояния);

	ИначеЕсли РезультатВопроса = КодВозвратаДиалога.Отмена Тогда
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура УстановитьГраницыВыделенияДляОбработкиСтрок(ЭлементТекст, НачальнаяСтрока, НачальнаяКолонка, КонечнаяСтрока,
	КонечнаяКолонка)

	ЭлементТекст.ПолучитьГраницыВыделения(НачальнаяСтрока, НачальнаяКолонка, КонечнаяСтрока, КонечнаяКолонка);

	Если НачальнаяСтрока = КонечнаяСтрока И НачальнаяКолонка = КонечнаяКолонка Тогда
		ЭлементТекст.УстановитьГраницыВыделения(1, 1, 1000000000, 1);
	Иначе

		Если НачальнаяКолонка > 1 Тогда
			НачальнаяКолонка = 1;
		КонецЕсли;

		Если КонечнаяКолонка > 1 Тогда
			КонечнаяСтрока = КонечнаяСтрока + 1;
			КонечнаяКолонка = 1;
		КонецЕсли;

		ЭлементТекст.УстановитьГраницыВыделения(НачальнаяСтрока, НачальнаяКолонка, КонечнаяСтрока, КонечнаяКолонка);

	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура СохранитьПакетЗапросов(Контекст)

	Если Не ЗначениеЗаполнено(ИмяФайлаЗапросов) Тогда
		ОписаниеОповещения = Новый ОписаниеОповещения("СохранитьПакетЗапросовПродолжение", ЭтаФорма, Контекст);
		Автосохранить(ОписаниеОповещения);
		Возврат;
	КонецЕсли;

	Контекст.Вставить("ПроцедураОповещенияЗавершенияСохранения", "ПослеСохраненияПакетаЗапросов");
	Контекст.Вставить("ИмяФайлаСохранения", ПолучитьИмяФайлаАвтосохранения(ИмяФайлаЗапросов));
	Контекст.Вставить("ИмяФайлаЗапросов", ИмяФайлаЗапросов);
	ОписаниеОповещения = Новый ОписаниеОповещения("ЗакончитьСохранениеФайла", ЭтаФорма, Контекст);
	Автосохранить(ОписаниеОповещения);

КонецПроцедуры

&НаКлиенте
Процедура СохранитьПакетЗапросовПродолжение(Результат, Контекст) Экспорт
	ПакетЗапросовСохранитьКак(Контекст);
КонецПроцедуры

&НаКлиенте
Процедура ПакетЗапросовСохранитьКак(Контекст)

	ПоместитьРедактируемыйЗапрос();

	Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
	Диалог.Фильтр = ФильтрСохранения;

	ОписаниеОповещения = Новый ОписаниеОповещения("ПакетЗапросовСохранитьКак_ПослеВыбораФайла", ЭтаФорма, Контекст);
	Диалог.Показать(ОписаниеОповещения);

КонецПроцедуры

&НаКлиенте
Процедура ПакетЗапросовСохранитьКак_ПослеВыбораФайла(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт

	Если ВыбранныеФайлы = Неопределено Тогда
		Возврат;
	КонецЕсли;

	стрИмяФайла = ВыбранныеФайлы[0];
	
	//В вебе, в браузере под линуксом почему-то теряет расширение файлов после диалога записи.
	Файл = Новый Файл(стрИмяФайла);
	Если ВРег(Файл.Расширение) <> "." + ВРег(РасширениеФайлов) Тогда
		Сообщить(Файл.Расширение);
		стрИмяФайла = СтрШаблон("%1.%2", стрИмяФайла, РасширениеФайлов);
	КонецЕсли;

	УстановитьИмяФайлаЗапросов(стрИмяФайла);

	ДополнительныеПараметры = Новый Структура("ПроцедураОповещенияЗавершенияСохранения, ИмяФайлаСохранения, ИмяФайлаЗапросов",
		"ПослеСохраненияПакетаЗапросов", ПолучитьИмяФайлаАвтосохранения(ИмяФайлаЗапросов), ИмяФайлаЗапросов);
	ОписаниеОповещения = Новый ОписаниеОповещения("ЗакончитьСохранениеФайла", ЭтаФорма, ДополнительныеПараметры);
	Автосохранить(ОписаниеОповещения);

КонецПроцедуры
&НаКлиенте
Процедура ЗакончитьСохранениеФайла(Результат, ДополнительныеПараметры) Экспорт
	ОписаниеОповещение = Новый ОписаниеОповещения(ДополнительныеПараметры.ПроцедураОповещенияЗавершенияСохранения,
		ЭтаФорма, ДополнительныеПараметры);
	НачатьПеремещениеФайла(ОписаниеОповещение, ДополнительныеПараметры.ИмяФайлаСохранения,
		ДополнительныеПараметры.ИмяФайлаЗапросов);
КонецПроцедуры

&НаКлиенте
Процедура ПослеСохраненияПакетаЗапросов(ПеремещаемыйФайл, ДополнительныеПараметры) Экспорт

	Модифицированность = Ложь;

	Если ДополнительныеПараметры.Свойство("Завершение") Тогда
		Закрыть();
	ИначеЕсли ДополнительныеПараметры.Свойство("Новый") Тогда
		ПакетЗапросов_Новый();
	Иначе
		УИ_РедакторКодаКлиент.УстановитьОригинальныйТекстРедактораРавнымТекущему(ЭтотОбъект, "Запрос");
		УИ_РедакторКодаКлиент.УстановитьОригинальныйТекстРедактораРавнымТекущему(ЭтотОбъект, "Алгоритм");
		УИ_РедакторКодаКлиент.УстановитьОригинальныйТекстРедактораРавнымТекущему(ЭтотОбъект, "АлгоритмПередВыполнением");
	КонецЕсли;

КонецПроцедуры

#Область Команда_КонструкторЗапроса

&НаКлиенте
Функция ПолучитьКонструкторЗапроса(СтрТекстЗапроса)
	Перем СтрокаОшибки, НомерСтроки, НомерКолонки;

	Попытка
		КонструкторЗапроса = Новый КонструкторЗапроса(СтрТекстЗапроса);
	Исключение

		СтрокаОшибки = ОписаниеОшибки();
		РазобратьОшибкуЗапроса(СтрокаОшибки, НомерСтроки, НомерКолонки);

		ПоказатьПредупреждениеКонсоли(СтрокаОшибки);
		Если ЗначениеЗаполнено(НомерСтроки) Тогда
			УстановитьГраницыВыделенияЗапроса(НомерСтроки, НомерКолонки, НомерСтроки, НомерКолонки);
		КонецЕсли;

		Возврат Неопределено;

	КонецПопытки;

	Возврат КонструкторЗапроса;

КонецФункции



&НаКлиенте
Процедура Команда_КонструкторЗапроса_ОповещениеЗакрытияКонструктора(стрТекстЗапроса, ТекущийЗапрос) Экспорт

	Если Не Запрос_ПолучитьВКонструкторе(ТекущийЗапрос) Тогда
		Возврат;
	КонецЕсли;

	Запрос_УстановитьВКонструкторе(ТекущийЗапрос, Ложь);
	ЗапросВКонструкторе = -1;

	Если стрТекстЗапроса <> Неопределено Тогда
		КомментарииЗапроса_Восстановить(стрТекстЗапроса);
		Запрос_ПоместитьДанныеЗапроса(РедактируемыйЗапрос, стрТекстЗапроса);
		Модифицированность = Истина;
	КонецЕсли;

	ИзвлечьРедактируемыйЗапрос(ТекущийЗапрос);

КонецПроцедуры

#КонецОбласти

&НаКлиенте
Процедура ВыполнитьЗапрос(фИспользоватьВыделение)
	Если ОпцияАвтосохранениеПередВыполнениемЗапроса И Модифицированность Тогда
		Автосохранить();
	КонецЕсли;

	ИменаПеременных = Новый Массив;
	ИменаПеременных.Добавить("мЗапрос");
	
	ПараметрыОповещения = Новый Структура;
	ПараметрыОповещения.Вставить("фИспользоватьВыделение", фИспользоватьВыделение);

	УИ_РедакторКодаКлиент.НачатьСборкуОбработокДляИсполненияКода(ЭтотОбъект,
																 Новый ОписаниеОповещения("ВыполнитьЗапросЗавершениеСохраненияОбработокИсполненияАлгоритмов",
		ЭтотОбъект, ПараметрыОповещения),
																 Новый Структура("АлгоритмПередВыполнением", ИменаПеременных));

КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьЗапросЗавершениеСохраненияОбработокИсполненияАлгоритмов(Результат, ДополнительныеПараметры) Экспорт
	ГраницыВыделенияЗапроса = ГраницыВыделенияЗапроса();
	фВесьТекст = Не ДополнительныеПараметры.фИспользоватьВыделение
				 Или (ГраницыВыделенияЗапроса.НачалоСтроки = ГраницыВыделенияЗапроса.КонецСтроки
					  И ГраницыВыделенияЗапроса.НачалоКолонки = ГраницыВыделенияЗапроса.КонецКолонки);
	Если фВесьТекст Тогда
		стрТекстЗапроса = ТекущийТекстЗапроса();
	Иначе
		стрТекстЗапроса = ВыделенныйТекстЗапроса();
	КонецЕсли;

	стРезультат = ВыполнитьЗапросНаСервере(стрТекстЗапроса, ТекущийАлгоритмПередВыполнением());
	Если ЗначениеЗаполнено(стРезультат.ОписаниеОшибки) Тогда
		ПоказатьПредупреждениеКонсоли(стРезультат.ОписаниеОшибки);
		ТекущийЭлемент = Элементы.ТекстЗапроса;
		Если ЗначениеЗаполнено(стРезультат.Строка) Тогда
			Если фВесьТекст Тогда
				УстановитьГраницыВыделенияЗапроса(стРезультат.Строка, стРезультат.Колонка,
					стРезультат.Строка, стРезультат.Колонка);
			Иначе
			КонецЕсли;
		КонецЕсли;
	Иначе

		РезультатНаФорме = -1;
		КоличествоВозвращенныхСтрокРезультата = ИзвлечьРезультат(стРезультат.КоличествоРезультатов);
		СтруктураЗаписиРезультата_Развернуть();

		ТекущаяСтрокаПакета = ПакетЗапросов.НайтиПоИдентификатору(Элементы.ПакетЗапросов.ТекущаяСтрока);
		ТекущаяСтрокаПакета.КоличествоСтрокРезультата = РезультатЗапроса.Количество();
		ВремяВыполнения = ФорматироватьДлительность(стРезультат.ВремяОкончания - стРезультат.ВремяНачала);
		Элементы.ПакетЗапросов.ТекущиеДанные.Инфо = Строка(КоличествоВозвращенныхСтрокРезультата) + " / "
			+ ВремяВыполнения;

	КонецЕсли;

	ИмяЗапросаРезультата = Элементы.ПакетЗапросов.ТекущиеДанные.Имя;
	ОбновитьСостояниеЭлементовФормыАлгоритма();

	
КонецПроцедуры

&НаСервере
Функция ПараметрыЗаполнитьИзЗапросаНаСервере(ТекущийТекстЗапроса)
	Перем НомерСтроки, НомерКолонки;

	ОбработкаОбъект = РеквизитФормыВЗначение("Объект");

	Запрос = Новый Запрос(ТекущийТекстЗапроса);
	Попытка
		Запрос.МенеджерВременныхТаблиц = ЗагрузитьВременныеТаблицы();
		НайденныеПараметры = Запрос.НайтиПараметры();
	Исключение
		СтрокаОшибки = ОписаниеОшибки();
		РазобратьОшибкуЗапроса(СтрокаОшибки, НомерСтроки, НомерКолонки);
		Возврат Новый Структура("ОписаниеОшибки, Строка, Колонка", СтрокаОшибки, НомерСтроки, НомерКолонки);
	КонецПопытки;

	Для Каждого Параметр Из НайденныеПараметры Цикл

		Если Объект.ОпцияОбрабатывать__ И СтрНачинаетсяС(Параметр.Имя, МакроПараметр) Тогда
			Продолжить;
		КонецЕсли;

		маСтрокиПараметра = ПараметрыЗапроса.НайтиСтроки(Новый Структура("Имя", Параметр.Имя));
		Если маСтрокиПараметра.Количество() > 0 Тогда
			СтрокаПараметра = маСтрокиПараметра[0];
		Иначе
			СтрокаПараметра = ПараметрыЗапроса.Добавить();
			СтрокаПараметра.Использовать = Истина;
			СтрокаПараметра.Имя = Параметр.Имя;
			Если Параметр.ТипЗначения = Новый ОписаниеТипов("ТаблицаЗначений") Тогда
				СтрокаПараметра.ТипКонтейнера = 3;
			КонецЕсли;

			ПараметрыЗапроса_СохранитьЗначение(СтрокаПараметра.ПолучитьИдентификатор(),
				Параметр.ТипЗначения.ПривестиЗначение(Неопределено));
		КонецЕсли;

		Если Не ЗначениеЗаполнено(СтрокаПараметра.ТипЗначения) Тогда
			СтрокаПараметра.ТипЗначения = Параметр.ТипЗначения;
		КонецЕсли;

	КонецЦикла;

	Возврат Неопределено;

КонецФункции

&НаКлиенте
Процедура ДобавитьПереносСтрокВТекст(ЭлементТекст)
	УИ_РедакторКодаКлиент.ДобавитьПереносСтрокРедактораЭлементаФормы(ЭтотОбъект, ЭлементТекст);
КонецПроцедуры

&НаКлиенте
Процедура УбратьПереносСтрокИзТекста(ЭлементТекст)
	УИ_РедакторКодаКлиент.УдалитьПереносСтрокРедактораЭлементаФормы(ЭтотОбъект, ЭлементТекст);
КонецПроцедуры


&НаКлиенте
Процедура ДобавитьКомментированиеСтрокВТекст(ЭлементТекст)
	
	УИ_РедакторКодаКлиент.ДобавитьКомментарииСтрокРедактораЭлементаФормы(ЭтотОбъект, ЭлементТекст);

КонецПроцедуры


&НаКлиенте
Процедура УбратьКомментированиеСтрокИзТекста(ЭлементТекст)
	УИ_РедакторКодаКлиент.УдалитьКомментарииСтрокРедактораЭлементаФормы(ЭтотОбъект, ЭлементТекст);
КонецПроцедуры




&НаКлиенте
Процедура СортироватьРезультатЗапросаТаблица(НаправлениеСортировки)
	ИмяКолонки = Элементы.РезультатЗапроса.ТекущийЭлемент.Имя;
	Если СтрЧислоВхождений(ИмяКолонки, "РезультатЗапроса") = 1 Тогда
		ИмяКолонки = СтрЗаменить(ИмяКолонки, "РезультатЗапроса", "");
		РезультатЗапроса.Сортировать(ИмяКолонки + " " + НаправлениеСортировки);
	ИначеЕсли СтрЧислоВхождений(ИмяКолонки, "РезультатЗапроса") > 1 Тогда
		ПоказатьПредупреждение(, "Нельза сортировать по колонке содержащей в названии ""РезультатЗапроса""");
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура СортироватьРезультатЗапросаДерево(НаправлениеСортировки)
	ИмяКолонки = Элементы.РезультатЗапросаДерево.ТекущийЭлемент.Имя;
	Если СтрЧислоВхождений(ИмяКолонки, "РезультатЗапросаДерево") = 1 Тогда
		ИмяКолонки = СтрЗаменить(ИмяКолонки, "РезультатЗапросаДерево", "");
		СортироватьРезультатЗапросаДеревоНаСервере(ИмяКолонки, НаправлениеСортировки);
	ИначеЕсли СтрЧислоВхождений(ИмяКолонки, "РезультатЗапросаДерево") > 1 Тогда 
		ПоказатьПредупреждение(, "Нельза сортировать по колонке содержащей в названии ""РезультатЗапросаДерево""");			
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура СортироватьРезультатЗапросаДеревоНаСервере(ИмяКолонки, НаправлениеСортировки)
	ДеревоРезультат = РеквизитФормыВЗначение("РезультатЗапросаДерево");
	ДеревоРезультат.Строки.Сортировать(ИмяКолонки + " " + НаправлениеСортировки, Истина);
	ЗначениеВРеквизитФормы(ДеревоРезультат, "РезультатЗапросаДерево");
КонецПроцедуры

#Область Команда_ВыполнитьОбработку

&НаСервере
Функция ЗапуститьОбработкуНаСервере(Алгоритм, фПострочно = Истина)

	ИмяМодуляДлительныеОперации = "ДлительныеОперации";
	ИмяМодуляСтандартныеПодсистемыСервер = "СтандартныеПодсистемыСервер";
	Если Метаданные.ОбщиеМодули.Найти(ИмяМодуляДлительныеОперации) = Неопределено Или Метаданные.ОбщиеМодули.Найти(
		ИмяМодуляСтандартныеПодсистемыСервер) = Неопределено Тогда
		Возврат Новый Структура("Успешно, ОписаниеОшибки", Ложь, "Модули БСП не найдены");
	КонецЕсли;

	МодульСтандартныеПодсистемыСервер = Вычислить(ИмяМодуляСтандартныеПодсистемыСервер);
	Попытка
		Версия = МодульСтандартныеПодсистемыСервер.ВерсияБиблиотеки();
	Исключение
		Возврат Новый Структура("Успешно, ОписаниеОшибки", Ложь, "Модули БСП не найдены");
	КонецПопытки;

	маВерсия = СтрРазделить(Версия, ".");
	Если Число(маВерсия[0]) <= 2 И Не (Число(маВерсия[0]) = 2 И Число(маВерсия[1]) >= 3) Тогда
		Возврат Новый Структура("Успешно, ОписаниеОшибки", Ложь, СтрШаблон(
			"Необходима БСП версии не ниже 2.3 (версия БСП текущей конфигурации %1)", Версия));
	КонецЕсли;

	ФоновоеЗаданиеАдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор);

	стРезультатЗапроса = ПолучитьИзВременногоХранилища(АдресРезультатаЗапроса);

	ПараметрыВыполнения = Новый Массив;
	ПараметрыВыполнения.Добавить(стРезультатЗапроса);
	ПараметрыВыполнения.Добавить(РезультатВПакете);
	ПараметрыВыполнения.Добавить(Алгоритм);
	ПараметрыВыполнения.Добавить(фПострочно);
	ПараметрыВыполнения.Добавить(Объект.ОпцияИнтервалОбновленияВыполненияАлгоритма);

	Если Объект.РежимЗапускаВнешняяОбработка Тогда
		ПараметрыМетода = Новый Структура("
										  |ЭтоВнешняяОбработка,
										  |ДополнительнаяОбработкаСсылка,
										  |ИмяОбработки,
										  |ИмяМетода,
										  |ПараметрыВыполнения", Истина, Неопределено, ИмяФайлаОбработкиНаСервере,
			"ВыполнитьАлгоритмПользователя", ПараметрыВыполнения);
	Иначе
		ПараметрыМетода = Новый Структура("
										  |ЭтоВнешняяОбработка,
										  |ДополнительнаяОбработкаСсылка,
										  |ИмяОбработки,
										  |ИмяМетода,
										  |ПараметрыВыполнения", Ложь, Неопределено, Объект.ИмяОбработки,
			"ВыполнитьАлгоритмПользователя", ПараметрыВыполнения);
	КонецЕсли;

	ФоновоеЗаданиеСостояниеПрогресса = Неопределено;
	ПараметрыФоновогоЗадания = Новый Массив;
	ПараметрыФоновогоЗадания.Добавить(ПараметрыМетода);
	ПараметрыФоновогоЗадания.Добавить(ФоновоеЗаданиеАдресРезультата);
	Задание = ФоновыеЗадания.Выполнить("ДлительныеОперации.ВыполнитьПроцедуруМодуляОбъектаОбработки",
		ПараметрыФоновогоЗадания, , Объект.Заголовок);
	ФоновоеЗаданиеИдентификатор = Задание.УникальныйИдентификатор;

	Возврат Новый Структура("Успешно", Истина);

КонецФункции

&НаСервере
Функция ПолучитьСостояниеФоновогоЗадания()

	ФоновоеЗадание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(
		Новый УникальныйИдентификатор(ФоновоеЗаданиеИдентификатор));
	СостояниеЗадания = Новый Структура("СостояниеПрогресса, Начало, Состояние, ИнформацияОбОшибке, СообщенияПользователю");
	ЗаполнитьЗначенияСвойств(СостояниеЗадания, ФоновоеЗадание, "Начало, Состояние, ИнформацияОбОшибке");

	Если МетодИсполненияКода = 2 Или МетодИсполненияКода = 4 Тогда
		СостояниеЗадания.СостояниеПрогресса = ФоновоеЗаданиеСостояниеПрогресса;
	КонецЕсли;

	СообщенияПользователю = ФоновоеЗадание.ПолучитьСообщенияПользователю(Истина);
	СостояниеЗадания.СообщенияПользователю = Новый Массив;
	Для Каждого Сообщение Из СообщенияПользователю Цикл
		Если СтрНачинаетсяС(Сообщение.Текст, ФоновоеЗаданиеАдресРезультата) Тогда
			СостояниеИзСообщения = РеквизитФормыВЗначение("Объект").СтрокаВЗначение(Прав(Сообщение.Текст, СтрДлина(
				Сообщение.Текст) - СтрДлина(ФоновоеЗаданиеАдресРезультата)));
			СостояниеЗадания.СостояниеПрогресса = СостояниеИзСообщения;
			ФоновоеЗаданиеСостояниеПрогресса = СостояниеИзСообщения;
		Иначе
			СостояниеЗадания.СообщенияПользователю.Добавить(Сообщение);
		КонецЕсли;
	КонецЦикла;

	Если ФоновоеЗадание.Состояние = СостояниеФоновогоЗадания.Активно Тогда
		СостояниеЗадания.Состояние = 0;
	ИначеЕсли ФоновоеЗадание.Состояние = СостояниеФоновогоЗадания.Завершено Тогда
		СостояниеЗадания.Состояние = 1;
	ИначеЕсли ФоновоеЗадание.Состояние = СостояниеФоновогоЗадания.ЗавершеноАварийно Тогда
		СостояниеЗадания.Состояние = 2;
	ИначеЕсли ФоновоеЗадание.Состояние = СостояниеФоновогоЗадания.Отменено Тогда
		СостояниеЗадания.Состояние = 3;
	КонецЕсли;

	Если ФоновоеЗадание.ИнформацияОбОшибке <> Неопределено Тогда
		СостояниеЗадания.ИнформацияОбОшибке = ПолучитьПредставлениеИнформацииОбОшибке(ФоновоеЗадание.ИнформацияОбОшибке);
	КонецЕсли;

	Возврат СостояниеЗадания;

КонецФункции

&НаКлиенте
Процедура ОтобразитьСостояниеВыполненияАлгоритма(СостояниеПрогресса = Неопределено, Секунды = Неопределено,
	фЧерезСостояние = Ложь)

	Если Секунды = Неопределено Тогда
		СостояниеВыполнения = "";
		Элементы.ВыполнитьОбработку.Заголовок = "Выполнить";
		Элементы.ВыполнитьОбработку.Картинка = БиблиотекаКартинок.СформироватьОтчет;
		ОбновитьСостояниеЭлементовФормыАлгоритма();
	Иначе

		стрВремяВыполнения = ВремяИзСекунд(Секунды);

		Если СостояниеПрогресса <> Неопределено Тогда
			стрПрогресс = Формат(СостояниеПрогресса.Прогресс, "ЧЦ=3; ЧДЦ=0; ЧН=") + "%";
			Если СостояниеПрогресса.Прогресс > 0 И СостояниеПрогресса.ДлительностьНаМоментПрогресса > 1000 Тогда
				стрВремяОсталось = СтрШаблон("осталось примерно %1", ВремяИзСекунд(Окр(
					СостояниеПрогресса.ДлительностьНаМоментПрогресса / СостояниеПрогресса.Прогресс * (100
					- СостояниеПрогресса.Прогресс) / 1000)));
			Иначе
				стрВремяОсталось = "";
			КонецЕсли;
			стрПояснение = СтрШаблон("%1 прошло %2 %3", стрПрогресс, стрВремяВыполнения, стрВремяОсталось);
		Иначе
			стрПрогресс = "";
			стрПояснение = СтрШаблон("%1 прошло %2", стрПрогресс, стрВремяВыполнения);
		КонецЕсли;

		Если фЧерезСостояние Тогда
			Состояние("Выполнение алгоритма", СостояниеПрогресса.Прогресс, стрПояснение);
		Иначе
			СостояниеВыполнения = стрПояснение;
		КонецЕсли;

	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ОтобразитьСостояниеФоновогоЗадания() Экспорт

	Если Не ЗначениеЗаполнено(ФоновоеЗаданиеИдентификатор) Тогда
		ОтобразитьСостояниеВыполненияАлгоритма();
		Возврат;
	КонецЕсли;

	СостояниеЗадания = ПолучитьСостояниеФоновогоЗадания();

	Если СостояниеЗадания.СообщенияПользователю <> Неопределено Тогда
		Для Каждого СообщениеПользователю Из СостояниеЗадания.СообщенияПользователю Цикл
			СообщениеПользователю.Сообщить();
		КонецЦикла;
	КонецЕсли;

	Если СостояниеЗадания.Состояние = 0 Тогда
		ОтобразитьСостояниеВыполненияАлгоритма(СостояниеЗадания.СостояниеПрогресса, ТекущаяДата()
			- СостояниеЗадания.Начало);
		ПодключитьОбработчикОжидания("ОтобразитьСостояниеФоновогоЗадания",
			Объект.ОпцияИнтервалОбновленияВыполненияАлгоритма / 1000 / 2, Истина);
	ИначеЕсли СостояниеЗадания.Состояние = 2 Тогда
		ПоказатьПредупреждениеКонсоли(СостояниеЗадания.ИнформацияОбОшибке);
		ФоновоеЗаданиеИдентификатор = "";
		ОтобразитьСостояниеВыполненияАлгоритма();
	Иначе
		ФоновоеЗаданиеИдентификатор = "";
		ОтобразитьСостояниеВыполненияАлгоритма();
	КонецЕсли;

КонецПроцедуры

&НаСервере
Функция ВыполнитьАлгоритм(Алгоритм)

	стРезультатЗапроса = ПолучитьИзВременногоХранилища(АдресРезультатаЗапроса);
	маРезультатЗапроса = стРезультатЗапроса.Результат;
	стРезультат = маРезультатЗапроса[Число(РезультатВПакете) - 1];
	рзВыборка = стРезультат.Результат;
	выбВыборка = рзВыборка.Выбрать();

	Контекст = Новый Структура;
	Контекст.Вставить("Выборка", выбВыборка);
	Контекст.Вставить("Параметры", стРезультатЗапроса.Параметры);
	РезультатВыполнения = УИ_РедакторКодаКлиентСервер.ВыполнитьАлгоритм(Алгоритм, Контекст, Ложь, ЭтотОбъект, "Алгоритм");

	Если РезультатВыполнения.Успешно Тогда
		Возврат Новый Структура("Успешно, Продолжать, ОписаниеОшибки", Истина);
	Иначе
		Возврат Новый Структура("Успешно, Продолжать, ОписаниеОшибки", Ложь, Ложь, РезультатВыполнения.ОписаниеОшибки);
	КонецЕсли;

КонецФункции

&НаСервере
Функция ВыполнитьАлгоритмПострочно(АдресРезультатаЗапроса, РезультатВПакете, ТекстАлгоритма)

	стРезультатЗапроса = ПолучитьИзВременногоХранилища(АдресРезультатаЗапроса);
	маРезультатЗапроса = стРезультатЗапроса.Результат;
	стРезультат = маРезультатЗапроса[Число(РезультатВПакете) - 1];
	рзВыборка = стРезультат.Результат;
	выбВыборка = рзВыборка.Выбрать();
	
	Контекст = Новый Структура;
	Контекст.Вставить("Выборка", выбВыборка);
	Контекст.Вставить("Параметры", стРезультатЗапроса.Параметры);

	Пока выбВыборка.Следующий() Цикл
		РезультатВыполнения = УИ_РедакторКодаКлиентСервер.ВыполнитьАлгоритм(ТекстАлгоритма,
																			Контекст,
																			Ложь,
																			ЭтотОбъект,
																			"Алгоритм");
		Если Не РезультатВыполнения.Успешно Тогда
			Возврат Новый Структура("Успешно, Продолжать, ОписаниеОшибки", Ложь, Ложь,
				РезультатВыполнения.ОписаниеОшибки);
		КонецЕсли;
	КонецЦикла;

	Возврат Новый Структура("Успешно, Продолжать, ОписаниеОшибки, Прогресс", Истина, Ложь, Неопределено, 100);

КонецФункции

&НаСервере
Функция ВыполнитьАлгоритмНаСервереПострочно(АдресСостояния, АдресРезультатаЗапроса, РезультатВПакете, ТекстАлгоритма,
	ОпцияИнтервалОбновленияВыполненияАлгоритма)

	стСостояние = ПолучитьИзВременногоХранилища(АдресСостояния);

	Если стСостояние = Неопределено Тогда
		стРезультатЗапроса = ПолучитьИзВременногоХранилища(АдресРезультатаЗапроса);
		маРезультатЗапроса = стРезультатЗапроса.Результат;
		стРезультат = маРезультатЗапроса[Число(РезультатВПакете) - 1];
		рзВыборка = стРезультат.Результат;
		выбВыборка = рзВыборка.Выбрать();
		стСостояние = Новый Структура("Выборка, Параметры, КоличествоВсего, КоличествоСделано, Начало, НачалоВМиллисекундах",
			выбВыборка, стРезультатЗапроса.Параметры, выбВыборка.Количество(), 0, ТекущаяДата(),
			ТекущаяУниверсальнаяДатаВМиллисекундах());
	КонецЕсли;

	выбВыборка = стСостояние.Выборка;
	чКоличествоСделано = стСостояние.КоличествоСделано;
	чМоментОкончанияПорции = ТекущаяУниверсальнаяДатаВМиллисекундах() + ОпцияИнтервалОбновленияВыполненияАлгоритма;

	//Попытка
	Контекст = Новый Структура;
	Контекст.Вставить("Выборка", выбВыборка);
	Контекст.Вставить("Параметры", стСостояние.Параметры);

	фПродолжать = Ложь;
	Пока выбВыборка.Следующий() Цикл

		РезультатВыполнения = УИ_РедакторКодаКлиентСервер.ВыполнитьАлгоритм(ТекстАлгоритма,
																			Контекст,
																			Ложь,
																			ЭтотОбъект,
																			"Алгоритм");
		Если Не РезультатВыполнения.Успешно Тогда
			Возврат Новый Структура("Успешно, Продолжать, ОписаниеОшибки", Ложь, Ложь,
				РезультатВыполнения.ОписаниеОшибки);
		КонецЕсли;
		чКоличествоСделано = чКоличествоСделано + 1;

		Если ТекущаяУниверсальнаяДатаВМиллисекундах() >= чМоментОкончанияПорции Тогда
			фПродолжать = Истина;
			Прервать;
		КонецЕсли;

	КонецЦикла;

	стСостояние.КоличествоСделано = чКоличествоСделано;


	Если фПродолжать Тогда
		стСостояние.Выборка = выбВыборка;
		ПоместитьВоВременноеХранилище(стСостояние, АдресСостояния);
	Иначе
		ПоместитьВоВременноеХранилище(Неопределено, АдресСостояния);
	КонецЕсли;

	Возврат Новый Структура("Успешно, Продолжать, ОписаниеОшибки, Прогресс, Начало, ДлительностьНаМоментПрогресса",
		Истина, фПродолжать, Неопределено, стСостояние.КоличествоСделано * 100 / стСостояние.КоличествоВсего,
		стСостояние.Начало, ТекущаяУниверсальнаяДатаВМиллисекундах() - стСостояние.НачалоВМиллисекундах);

КонецФункции

&НаКлиенте
Функция ВыполнитьАлгоритмПострочноСИндикацией()

	Если Не ЗначениеЗаполнено(АдресСостояния) Тогда
		АдресСостояния = ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор);
	Иначе
		ПоместитьВоВременноеХранилище(Неопределено, АдресСостояния);
	КонецЕсли;

	Пока Истина Цикл

		стРезультат = ВыполнитьАлгоритмНаСервереПострочно(АдресСостояния, АдресРезультатаЗапроса, РезультатВПакете,
			ТекущийТекстАлгоритма(), Объект.ОпцияИнтервалОбновленияВыполненияАлгоритма);

		Если Не стРезультат.Успешно Тогда
			Прервать;
		КонецЕсли;

		ОтобразитьСостояниеВыполненияАлгоритма(стРезультат, ТекущаяДата() - стРезультат.Начало, Истина);
		ОбработкаПрерыванияПользователя();

		Если Не стРезультат.Продолжать Тогда
			Прервать;
		КонецЕсли;

	КонецЦикла;

	ОтобразитьСостояниеВыполненияАлгоритма();

	Возврат стРезультат;

КонецФункции

&НаСервере
Процедура ПрерватьФоновоеЗадание()
	ФоновоеЗадание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(
		Новый УникальныйИдентификатор(ФоновоеЗаданиеИдентификатор));
	ФоновоеЗадание.Отменить();
	ФоновоеЗаданиеИдентификатор = "";
КонецПроцедуры

#КонецОбласти

&НаКлиенте
Процедура ОкончаниеВыбораПредопределенного(РезультатЗакрытия, ДополнительныеПараметры) Экспорт
	Если ЗначениеЗаполнено(РезультатЗакрытия) Тогда
		ДанныеФормыВыборПредопределенного = РезультатЗакрытия.ДанныеФормы;
		ВставитьТекстПоПозицииКурсораЗапроса(РезультатЗакрытия.Результат);
	КонецЕсли;
КонецПроцедуры

#Область Команда_ПолучитьКодСПараметрами

#КонецОбласти //Команда_ПолучитьКодСПараметрами

&НаСервере
Процедура ПараметрыЗапросаРядомСТекстомНаСервере()
	Если Элементы.ПараметрыЗапросаРядомСТекстом.Пометка Тогда
		Элементы.Переместить(Элементы.ПараметрыЗапроса, Элементы.ГруппаПараметры);
	Иначе
		Элементы.Переместить(Элементы.ПараметрыЗапроса, Элементы.СтраницаПараметры);
	КонецЕсли;
КонецПроцедуры

#Область Команда_ТехнологическийЖурнал

&НаСервере
Процедура ТехнологическийЖурнал_Выключить()
	Обработка = РеквизитФормыВЗначение("Объект");
	Обработка.ТехнологическийЖурнал_Выключить();
	ЗначениеВРеквизитФормы(Обработка, "Объект");
КонецПроцедуры

&НаСервере
Процедура ТехнологическийЖурнал_Включить()
	Обработка = РеквизитФормыВЗначение("Объект");
	Обработка.ТехнологическийЖурнал_Включить();
	ЗначениеВРеквизитФормы(Обработка, "Объект");
КонецПроцедуры

&НаСервере
Функция ТехнологическийЖурнал_Включился()
	Обработка = РеквизитФормыВЗначение("Объект");
	фРезультат = Обработка.ТехнологическийЖурнал_Включился();
	ЗначениеВРеквизитФормы(Обработка, "Объект");
	Возврат фРезультат;
КонецФункции

&НаСервере
Функция ТехнологическийЖурнал_Выключился()
	Обработка = РеквизитФормыВЗначение("Объект");
	фРезультат = Обработка.ТехнологическийЖурнал_Выключился();
	ЗначениеВРеквизитФормы(Обработка, "Объект");
	Возврат фРезультат;
КонецФункции

&НаКлиенте
Процедура ТехнологическийЖурнал_ОжиданиеВключения() Экспорт

	Если Не Элементы.ТехнологическийЖурнал.Пометка Тогда
		Возврат;
	КонецЕсли;

	Если ТехнологическийЖурнал_Включился() Тогда
		ТехнологическийЖурнал_ИндикацияВключения(Истина);
	Иначе
		Если ТекущаяУниверсальнаяДатаВМиллисекундах() - ТехнологическийЖурналВремяВключенияВыключения < 60 * 1000 Тогда
			ПодключитьОбработчикОжидания("ТехнологическийЖурнал_ОжиданиеВключения",
				ОпцияПериодОпросаВключенияВыключенияТехнологическогоЖурнала, Истина);
		Иначе
			//Технологический журнал включить не получилось.
			ТехнологическийЖурнал_Выключить();
			Элементы.ТехнологическийЖурнал.Пометка = Ложь;
		КонецЕсли;
	КонецЕсли;

КонецПроцедуры

&НаСервере
Процедура ТехнологическийЖурнал_ИндикацияВключения(фВключен)
	Если фВключен Тогда
		Элементы.ТехнологическийЖурнал.ЦветФона = Новый Цвет(220, 0, 0);
		Элементы.ТехнологическийЖурнал.ЦветТекста = Новый Цвет(255, 255, 255);
		ТехнологическийЖурналВключенИРаботает = Объект.ТехнологическийЖурналВключен
			И Элементы.ТехнологическийЖурнал.Пометка;
	Иначе
		Элементы.ТехнологическийЖурнал.ЦветФона = Новый Цвет;
		Элементы.ТехнологическийЖурнал.ЦветТекста = Новый Цвет;
		ТехнологическийЖурналВключенИРаботает = Ложь;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ТехнологическийЖурнал_ОжиданиеВыключения() Экспорт

	Если Элементы.ТехнологическийЖурнал.Пометка Тогда
		Возврат;
	КонецЕсли;

	Если ТехнологическийЖурнал_Выключился() Тогда
		ТехнологическийЖурнал_ИндикацияВключения(Ложь);
	Иначе
		Если ТекущаяУниверсальнаяДатаВМиллисекундах() - ТехнологическийЖурналВремяВключенияВыключения < 60 * 1000 Тогда
			ПодключитьОбработчикОжидания("ТехнологическийЖурнал_ОжиданиеВыключения",
				ОпцияПериодОпросаВключенияВыключенияТехнологическогоЖурнала, Истина);
		Иначе
			//Не удалось удалить папку с файлами технологического журнала. Довольно странная ситуация.
			//Но конфиг исправлен, прошло 60 секунд. Будем считать, что он выключен, других вариантов нет.
			ТехнологическийЖурнал_ИндикацияВключения(Ложь);
		КонецЕсли;
	КонецЕсли;

КонецПроцедуры

#КонецОбласти //Команда_ТехнологическийЖурнал

&НаКлиенте
Процедура ВыполнитьПродолжение(ДополнительныеПараметры)

	Если ДополнительныеПараметры.Продолжение = "ПриОткрытииПродолжение" Тогда
		ПриОткрытииПродолжение(ДополнительныеПараметры);
		Возврат;
	ИначеЕсли ДополнительныеПараметры.Продолжение = "ЗагрузитьПакетЗапросов" Тогда
		ЗагрузитьПакетЗапросов(ДополнительныеПараметры);
		Возврат;
	ИначеЕсли ДополнительныеПараметры.Продолжение = "ПродолжениеПакетЗапросов_Новый" Тогда
		ПродолжениеПакетЗапросов_Новый(ДополнительныеПараметры);
		Возврат;
	ИначеЕсли ДополнительныеПараметры.Продолжение = "ПослеВыбораФайлаДляЗагрузкиПакетаЗапросовЗавершение" Тогда
		ПослеВыбораФайлаДляЗагрузкиПакетаЗапросовЗавершение(ДополнительныеПараметры);
		Возврат;
	КонецЕсли;
	
	//Везде, кроме веб-клиенат замечательно работает вот это:
	Выполнить (ДополнительныеПараметры.Продолжение + "(ДополнительныеПараметры);");
	//Но в веб-клиенте "Выполнить" не работает, поэтому потребовалась эта процедура.
	//Если в вебе выдаст ошибку на этой строке, значит, забыли что-то добавить в условие выше. В тонком и толстом клиенте ошибки не будет в любом случае.

КонецПроцедуры

&НаКлиенте
Процедура ПослеВыбораФайлаДляЗагрузкиПакетаЗапросовЗавершение(ДополнительныеПараметры) Экспорт
	
	Если Не ДополнительныеПараметры.Свойство("Добавление") Тогда
		УстановитьИмяФайлаЗапросов(ДополнительныеПараметры.ИмяФайла);
	КонецЕсли;
	
	РедактируемыйЗапрос = -1;
	ПакетЗапросов_Сохранить( , ИмяФайлаАвтосохраненияСостояния, Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура ПродолжениеПакетЗапросов_Новый(ДополнительныеПараметры)
	ПакетЗапросов_Новый();
КонецПроцедуры

#КонецОбласти //ИнтерактивныеКоманды

#Область ПолучитьФайлыТехнологическогоЖурналаКонсоли

&НаКлиенте
Процедура ПолучитьФайлыТехнологическогоЖурналаКонсоли(КаталогСохранения)

	маЛоги = ПолучитьСписокФайловЖурнала();
	Для Каждого ФайлЛога Из маЛоги Цикл
		Сообщить(ФайлЛога.ПолноеИмя);
	КонецЦикла;

КонецПроцедуры

&НаСервере
Функция ПолучитьСписокФайловЖурнала()
	маЛоги = НайтиФайлы(Объект.КаталогТехнологическогоЖурнала, "*.log", Истина);
	Возврат маЛоги;
КонецФункции

#КонецОбласти //Команда_ПолучитьФайлыТехнологическогоЖурналаКонсоли

#Область Алгоритмы

&НаКлиенте
Процедура УстановитьТекстАлгоритма(НовыйТекст, УстанавливатьОригинальныйТекст = Ложь, НовыйОригинальныйТекст = "")
	Если УИ_ВходитВСоставУниверсальныхИнструментов Тогда
		УИ_РедакторКодаКлиент.УстановитьТекстРедактора(ЭтотОбъект, "Алгоритм", НовыйТекст, УстанавливатьОригинальныйТекст);
		
		Если УстанавливатьОригинальныйТекст Тогда
			УИ_РедакторКодаКлиент.УстановитьОригинальныйТекстРедактора(ЭтотОбъект, "Алгоритм", НовыйОригинальныйТекст);
		КонецЕсли;
	Иначе
		ТекстАлгоритм = НовыйТекст;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура УстановитьТекстАлгоритмаПередВыполнением(НовыйТекст, УстанавливатьОригинальныйТекст = Ложь,
	НовыйОригинальныйТекст = "")
	Если УИ_ВходитВСоставУниверсальныхИнструментов Тогда
		УИ_РедакторКодаКлиент.УстановитьТекстРедактора(ЭтотОбъект, "АлгоритмПередВыполнением", НовыйТекст,
			УстанавливатьОригинальныйТекст);

		Если УстанавливатьОригинальныйТекст Тогда
			УИ_РедакторКодаКлиент.УстановитьОригинальныйТекстРедактора(ЭтотОбъект, "АлгоритмПередВыполнением",
				НовыйОригинальныйТекст);
				
			УИ_ДобавитьКонтекстАлгоритмаПередВыполнением();
			
		КонецЕсли;
	Иначе
		ТекстАлгоритм = НовыйТекст;
	КонецЕсли;
КонецПроцедуры


&НаКлиенте
Процедура УстановитьТекстЗапроса(НовыйТекст, УстанавливатьОригинальныйТекст = Ложь, НовыйОригинальныйТекст = "")
	Если УИ_ВходитВСоставУниверсальныхИнструментов Тогда
		УИ_РедакторКодаКлиент.УстановитьТекстРедактора(ЭтотОбъект, "Запрос", НовыйТекст);
		
		Если УстанавливатьОригинальныйТекст Тогда
			УИ_РедакторКодаКлиент.УстановитьОригинальныйТекстРедактора(ЭтотОбъект, "Запрос", НовыйОригинальныйТекст);
		КонецЕсли;
	Иначе
		ТекстЗапроса = НовыйТекст;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Функция ТекущийТекстАлгоритма()
	Если УИ_ВходитВСоставУниверсальныхИнструментов Тогда
		Возврат УИ_РедакторКодаКлиент.ТекстКодаРедактора(ЭтотОбъект, "Алгоритм");
	Иначе
		Возврат ТекстАлгоритм;
	КонецЕсли;
КонецФункции

&НаКлиенте
Функция ТекущийТекстЗапроса()
	Если УИ_ВходитВСоставУниверсальныхИнструментов Тогда
		Возврат УИ_РедакторКодаКлиент.ТекстКодаРедактора(ЭтотОбъект, "Запрос");
	Иначе
		Возврат ТекстЗапроса;
	КонецЕсли;
КонецФункции

&НаКлиенте
Функция ТекущийАлгоритмПередВыполнением()
	Возврат УИ_РедакторКодаКлиент.ТекстКодаРедактора(ЭтотОбъект, "АлгоритмПередВыполнением");
КонецФункции

&НаКлиенте
Функция ГраницыВыделенияЭлемента(Элемент)
	Границы = Новый Структура;
	Границы.Вставить("НачалоСтроки", 0);
	Границы.Вставить("НачалоКолонки", 0);
	Границы.Вставить("КонецСтроки", 0);
	Границы.Вставить("КонецКолонки", 0);

	Элемент.ПолучитьГраницыВыделения(Границы.НачалоСтроки, Границы.НачалоКолонки, Границы.КонецСтроки,
		Границы.КонецКолонки);

	Возврат Границы;
КонецФункции

&НаКлиенте
Процедура УстановитьГраницыВыделенияАлгоритма(НачалоСтроки, НачалоКолонки, КонецСтроки, КонецКолонки)
	Если УИ_ВходитВСоставУниверсальныхИнструментов Тогда
		УИ_РедакторКодаКлиент.УстановитьГраницыВыделения(ЭтотОбъект, "Алгоритм", НачалоСтроки, НачалоКолонки,
			КонецСтроки, КонецКолонки);
	Иначе
		Элементы.ТекстАлгоритм.УстановитьГраницыВыделения(НачалоСтроки, НачалоКолонки, КонецСтроки, КонецКолонки);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура УстановитьГраницыВыделенияЗапроса(НачалоСтроки, НачалоКолонки, КонецСтроки, КонецКолонки)
	Если УИ_ВходитВСоставУниверсальныхИнструментов Тогда
		УИ_РедакторКодаКлиент.УстановитьГраницыВыделения(ЭтотОбъект, "Запрос", НачалоСтроки, НачалоКолонки,
			КонецСтроки, КонецКолонки);
	Иначе
		Элементы.ТекстЗапроса.УстановитьГраницыВыделения(НачалоСтроки, НачалоКолонки, КонецСтроки, КонецКолонки);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура УстановитьГраницыВыделенияЗапросаПоПозиции(Начало, Конец)
	
	Элементы.ТекстЗапроса.УстановитьГраницыВыделения(Начало, Конец);
	
КонецПроцедуры

&НаКлиенте 
Функция ГраницыВыделенияАлгоритма()
	Если УИ_ВходитВСоставУниверсальныхИнструментов Тогда
		Возврат УИ_РедакторКодаКлиент.ГраницыВыделенияРедактора(ЭтотОбъект, "Алгоритм");
	Иначе
		Возврат ГраницыВыделенияЭлемента(Элементы.ТекстАлгоритм);	
	КонецЕсли;
КонецФункции

&НаКлиенте 
Функция ГраницыВыделенияЗапроса()
	Если УИ_ВходитВСоставУниверсальныхИнструментов Тогда
		Возврат УИ_РедакторКодаКлиент.ГраницыВыделенияРедактора(ЭтотОбъект, "Запрос");
	Иначе
		Возврат ГраницыВыделенияЭлемента(Элементы.ТекстЗапроса);	
	КонецЕсли;
КонецФункции

&НаКлиенте
Процедура ВставитьТекстПоПозицииКурсораАлгоритма(Текст)
	Если УИ_ВходитВСоставУниверсальныхИнструментов Тогда
		УИ_РедакторКодаКлиент.ВставитьТекстПоПозицииКурсора(ЭтотОбъект, "Алгоритм", Текст);
	Иначе
		ВставитьТекстПоПозицииКурсораЭлемента(Элементы.ТекстАлгоритм, Текст);	
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ВставитьТекстПоПозицииКурсораЗапроса(Текст)
	Если УИ_ВходитВСоставУниверсальныхИнструментов Тогда
		УИ_РедакторКодаКлиент.ВставитьТекстПоПозицииКурсора(ЭтотОбъект, "Запрос", Текст);
	Иначе
		ВставитьТекстПоПозицииКурсораЭлемента(Элементы.ТекстЗапроса, Текст);	
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ВставитьТекстПоПозицииКурсораЭлемента(Элемент, Текст)
	Элемент.ВыделенныйТекст = Текст;
КонецПроцедуры

&НаКлиенте
Функция ВыделенныйТекстЗапроса()
	Если УИ_ВходитВСоставУниверсальныхИнструментов Тогда
		Возврат УИ_РедакторКодаКлиент.ВыделенныйТекстРедактора(ЭтотОбъект, "Запрос");
	Иначе
		Возврат Элементы.ТекстЗапроса.ВыделенныйТекст;	
	КонецЕсли;
КонецФункции

#КонецОбласти

#Область УИ

&НаКлиенте
Процедура УИ_ДобавитьКонтекстСтруктурыРезультатаАлгоритм()
	СтруктураДополнительногоКонтекста = Новый Структура;
	
	Для Каждого ДоступнаяПеременная Из СтруктураЗаписиРезультата.ПолучитьЭлементы() Цикл
		СтруктураПеременной = Новый Структура;
		Если ДоступнаяПеременная.Имя="Выборка" Тогда
			СтруктураПеременной.Вставить("Тип", "ВыборкаИзРезультатаЗапроса");
		Иначе
			СтруктураПеременной.Вставить("Тип", "Структура");
		КонецЕсли;
		
		СтруктураПеременной.Вставить("ПодчиненныеСвойства", Новый Структура);
		
		Для Каждого ТекРеквизитПеременной ИЗ ДоступнаяПеременная.ПолучитьЭлементы() Цикл
			НовоеСвойство = Новый Структура;
			НовоеСвойство.Вставить("ПодчиненныеСвойства", Новый Структура);
			НовоеСвойство.Вставить("Тип", ТекРеквизитПеременной.Тип);
			
			СтруктураПеременной.ПодчиненныеСвойства.Вставить(ТекРеквизитПеременной.Имя, НовоеСвойство);
		КонецЦикла;
		
		СтруктураДополнительногоКонтекста.Вставить(ДоступнаяПеременная.Имя, СтруктураПеременной);
	КонецЦикла;
	
	УИ_РедакторКодаКлиент.ДобавитьКонтекстРедактораКода(ЭтотОбъект, "Алгоритм", СтруктураДополнительногоКонтекста);


КонецПроцедуры

&НаКлиенте
Процедура УИ_ДобавитьКонтекстАлгоритмаПередВыполнением()
	СтруктураДополнительногоКонтекста = Новый Структура;
	СтруктураДополнительногоКонтекста.Вставить("мЗапрос", "classes.Запрос");

	УИ_РедакторКодаКлиент.ДобавитьКонтекстРедактораКода(ЭтотОбъект, "АлгоритмПередВыполнением", СтруктураДополнительногоКонтекста);

	
КонецПроцедуры

&НаКлиенте
Процедура УИ_РезультатСвойстваСтроки(Команда)
	
	ВидимостьСвойствСтроки = Не ВидимостьСвойствСтроки;

	Элементы.УИ_РезультатЗапросаСвойствоСтроки.Пометка = ВидимостьСвойствСтроки;
	Элементы.УИ_РезультатЗапросаДеревоСвойствоСтроки.Пометка = ВидимостьСвойствСтроки;
	Элементы.УИ_СвойстваСтроки.Видимость = ВидимостьСвойствСтроки;
	
	Если ВидимостьСвойствСтроки Тогда
		ИмяИсточника = УИ_ИмяИсточникаПоРеквизитуВидРезультата();
		УИ_ЗаполнитьСвойстваСтроки(ИмяИсточника);
		УИ_АктивизироватьСтрокуСвойстваСтроки(ИмяИсточника);	
	КонецЕсли;
		
КонецПроцедуры

&НаКлиенте
Процедура УИ_АктивизироватьСтрокуСвойстваСтроки(ИмяИсточника)
	Если Не ВидимостьСвойствСтроки Тогда
		Возврат;
	КонецЕсли;
	
	ТекущиеДанные = Элементы[ИмяИсточника].ТекущиеДанные;
	Если ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ИмяЭлемента = Элементы[ИмяИсточника].ТекущийЭлемент.Имя;
	ИмяЯчейки = РезультатЗапросаСоответствиеКолонок[ИмяЭлемента];
	Отбор = Новый Структура("Свойство", ИмяЯчейки);
	Стр = УИ_СвойстваСтроки.НайтиСтроки(Отбор);
	Если Стр.Количество() Тогда
		Элементы.УИ_СвойстваСтроки.ТекущаяСтрока = Стр[0].ПолучитьИдентификатор();
		КолонкаЗначение = Элементы.УИ_СвойстваСтроки.ПодчиненныеЭлементы.УИ_СвойстваСтрокиГруппа.ПодчиненныеЭлементы.УИ_СвойстваСтрокиЗначение;
		Элементы.УИ_СвойстваСтроки.ТекущийЭлемент = КолонкаЗначение; 
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура УИ_ЗаполнитьСвойстваСтроки(ИмяИсточника)
	Если Не ВидимостьСвойствСтроки Тогда
		Возврат;
	КонецЕсли;

	УИ_СвойстваСтроки.Очистить();
	ТекущиеДанные = Элементы[ИмяИсточника].ТекущиеДанные;
	Если ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Для Каждого ПодчиненныйЭлемент Из Элементы[ИмяИсточника].ПодчиненныеЭлементы Цикл		
		Имя = РезультатЗапросаСоответствиеКолонок[ПодчиненныйЭлемент.Имя];		
		Значение = Неопределено;		
		ТекущиеДанные.Свойство(Имя, Значение);
		НоваяСтр = УИ_СвойстваСтроки.Добавить();
		НоваяСтр.Свойство = Имя;
		НоваяСтр.Значение = Значение;
		Если РезультатЗапросаКолонкиКонтейнера.Свойство(Имя) Тогда
			НоваяСтр.Картинка = БиблиотекаКартинок.УИ_ТаблицаЗначений;
		ИначеЕсли ТипЗнч(Значение) = Тип("Дата") Тогда
			НоваяСтр.Картинка = БиблиотекаКартинок.УИ_Дата;
		ИначеЕсли ТипЗнч(Значение) = Тип("Строка") Тогда
			НоваяСтр.Картинка = БиблиотекаКартинок.УИ_Строка;
		ИначеЕсли ТипЗнч(Значение) = Тип("Число") Тогда
			НоваяСтр.Картинка = БиблиотекаКартинок.УИ_Число;
		ИначеЕсли ТипЗнч(Значение) = Тип("Булево") Тогда
			НоваяСтр.Картинка = БиблиотекаКартинок.УИ_Булево;
		ИначеЕсли ТипЗнч(Значение) = Тип("Null") Тогда
			НоваяСтр.Картинка = БиблиотекаКартинок.УИ_Null;
		Иначе
			НоваяСтр.Картинка = УИ_ПодобратьКартинкуСтрокиНаСервере(Значение);
		КонецЕсли;	
	КонецЦикла;

КонецПроцедуры

&НаКлиенте
Функция УИ_ИмяИсточникаПоРеквизитуВидРезультата()
	
	Если ВидРезультата = "таблица" Тогда
		ИмяИсточника = "РезультатЗапроса";	
	Иначе
		ИмяИсточника = "РезультатЗапросаДерево";
	КонецЕсли;
	
	Возврат ИмяИсточника;
	
КонецФункции

&НаСервереБезКонтекста
Функция УИ_ПодобратьКартинкуСтрокиНаСервере(Значение)
			
	Попытка
		ИмяМетаданных = Значение.Метаданные();
		ИмяБазовогоТипа = УИ_ОбщегоНазначения.ИмяБазовогоТипаПоОбъектуМетаданных(ИмяМетаданных);	
	Исключение
		Возврат Неопределено;
	КонецПопытки;
	
	Если ИмяБазовогоТипа = "Справочники" Тогда
		Картинка = БиблиотекаКартинок.Справочник;
	ИначеЕсли ИмяБазовогоТипа = "Документы" Тогда
		Картинка = БиблиотекаКартинок.Документ;
	ИначеЕсли ИмяБазовогоТипа = "Перечисления" Тогда
		Картинка = БиблиотекаКартинок.Перечисление;
	ИначеЕсли ИмяБазовогоТипа = "ПланыОбмена" Тогда
		Картинка = БиблиотекаКартинок.ПланОбмена;
	ИначеЕсли ИмяБазовогоТипа = "ПланыВидовХарактеристик" Тогда
		Картинка = БиблиотекаКартинок.ПланВидовХарактеристик;
	ИначеЕсли ИмяБазовогоТипа = "БизнесПроцессы" Тогда
		Картинка = БиблиотекаКартинок.БизнесПроцесс;
	ИначеЕсли ИмяБазовогоТипа = "Задачи" Тогда
		Картинка = БиблиотекаКартинок.Задача;
	ИначеЕсли ИмяБазовогоТипа = "ПланыСчетов" Тогда
		Картинка = БиблиотекаКартинок.ПланСчетов;
	ИначеЕсли ИмяБазовогоТипа = "ПланыВидовРасчета" Тогда
		Картинка = БиблиотекаКартинок.ПланВидовРасчета;
	ИначеЕсли ИмяБазовогоТипа = "Константы" Тогда
		Картинка = БиблиотекаКартинок.Константа;
	ИначеЕсли ИмяБазовогоТипа = "ЖурналыДокументов" Тогда
		Картинка = БиблиотекаКартинок.ЖурналДокументов;
	Иначе
		Картинка = Неопределено;
	КонецЕсли;
	
	Возврат Картинка;
	
КонецФункции

#Область ИнтеграцияКонструктораПредставлений

// Обработчик закрытия конструктора представлений.
// Вставляет результат работы конструктора в конец текущего текста запроса.
// 
// Параметры:
//  ТекстЗапросаПредставления - Строка - Текст запроса представления
//  ДополнительныеПараметры - Структура - Дополнительные параметры:
//	 * ГраницыВыделения - См. УИ_РедакторКодаКлиент.ГраницыВыделенияРедактораЭлементаФормы
&НаКлиенте
Процедура УИ_КонструкторПредставленийЗавершение(ТекстЗапросаПредставления, ДополнительныеПараметры) Экспорт
	
	Если ТекстЗапросаПредставления = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	УИ_ДобавитьПараметрыЗапросаИзПредставления(ТекстЗапросаПредставления);
	
	ГраницыВыделения = ДополнительныеПараметры.ГраницыВыделения;
	
	Если ГраницыВыделения.НачалоСтроки <> ГраницыВыделения.КонецСтроки
		Или ГраницыВыделения.НачалоКолонки <> ГраницыВыделения.КонецКолонки Тогда
			
		// Выделен текст запроса - заменяем выделенный текст результатом конструктора
		УИ_РедакторКодаКлиент.УстановитьГраницыВыделенияЭлементаФормы(ЭтотОбъект,
																	  Элементы.ТекстЗапроса,
																	  ГраницыВыделения.НачалоСтроки,
																	  ГраницыВыделения.НачалоКолонки,
																	  ГраницыВыделения.КонецСтроки,
																	  ГраницыВыделения.КонецКолонки);
																	  
		УИ_РедакторКодаКлиент.ВставитьТекстПоПозицииКурсораЭлементаФормы(ЭтотОбъект,
																		 Элементы.ТекстЗапроса,
																		 ТекстЗапросаПредставления);
	
	Иначе
		ТекущийТекстЗапроса = ТекущийТекстЗапроса();
		
		Если Не ПустаяСтрока(ТекущийТекстЗапроса) Тогда
			ТекущийТекстЗапроса = ТекущийТекстЗапроса + "
														|;
														|
														|////////////////////////////////////////////////////////////////////////////////
														|
														|" + ТекстЗапросаПредставления;
		Иначе
			ТекущийТекстЗапроса = ТекстЗапросаПредставления;
		КонецЕсли;
		
		УИ_РедакторКодаКлиент.УстановитьТекстРедактораЭлементаФормы(ЭтотОбъект, Элементы.ТекстЗапроса, ТекущийТекстЗапроса);
	КонецЕсли;

	Если Не УИ_ВставленКодЗаменыПредставлений Тогда
		УИ_ДобавитьКодЗаменыПредставленийВАлгоритмПередВыполнением(Истина);
	КонецЕсли;
	
	Модифицированность = Истина;
			
КонецПроцедуры

// Добавляет параметры запроса представления в форму таблицы параметров.
// Запрос должен быть корректен для схемы запроса.
// Если не удалось разобрать запрос, ничего не делает, не вызывает исключение.
//
// Параметры:
//  ТекстЗапросаПредставления	 - Строка - Текст представления
//
&НаСервере
Процедура УИ_ДобавитьПараметрыЗапросаИзПредставления(Знач ТекстЗапросаПредставления)
	
	Попытка
		СхемаЗапроса = Новый СхемаЗапроса;
		СхемаЗапроса.УстановитьТекстЗапроса(ТекстЗапросаПредставления);
		// Найденные параметры будут содержать те имена, которые необходимо добавить на форму.
		// Однако типы параметров неизвестны.
		ПараметрыПредставления = СхемаЗапроса.НайтиПараметры();
	Исключение 
		// Дальнейшая обработка не имеет смысла
		Возврат;
	КонецПопытки;
	
	Попытка
		МодульЗарплатаКадрыОбщиеНаборыДанных = УИ_ОбщегоНазначения.ОбщийМодуль("ЗарплатаКадрыОбщиеНаборыДанных");
		МодульЗарплатаКадрыОбщиеНаборыДанных.ЗаменитьЗапросыКПредставлениямВиртуальныхТаблиц(ТекстЗапросаПредставления);
		// Обход особенностей некоторых реальных запросов ЗУП и схемы запроса.
		// Проблема - схема запросов не понимает, какой тип у поля Сотрудник.
		ТекстЗапросаПредставления = СтрЗаменить(ТекстЗапросаПредставления,
											    ".Сотрудник.ФизическоеЛицо",
											    ".ВЫРАЗИТЬ(Сотрудник КАК Справочник.Сотрудники).ФизическоеЛицо");
		СхемаЗапроса.УстановитьТекстЗапроса(ТекстЗапросаПредставления);
		// Найденные параметры будут содержать как исходные параметры представления, так и "левые",
		// которые используются в запросе. Здесь становятся известны возможные типы значений параметров.
		ПараметрыПредставленияРеальногоЗапроса = СхемаЗапроса.НайтиПараметры();
		
		ОпределеныТипыПараметров = Истина;
	Исключение
		ОпределеныТипыПараметров = Ложь;
	КонецПопытки;
	
	Если ОпределеныТипыПараметров Тогда
		// К добавлению относятся только те параметры, которые присутствуют в тексте представления
		ПараметрыПредставленияДляДобавления = Новый Массив;
		
		Для Каждого ОписаниеПараметраРеальногоЗапроса Из ПараметрыПредставленияРеальногоЗапроса Цикл
			ОписаниеПараметраЗапросаПредставления = ПараметрыПредставления.Найти(ОписаниеПараметраРеальногоЗапроса.Имя);
			Если ОписаниеПараметраЗапросаПредставления <> Неопределено Тогда
				ПараметрыПредставленияДляДобавления.Добавить(ОписаниеПараметраРеальногоЗапроса);	
			КонецЕсли;
		КонецЦикла;
	Иначе
		ПараметрыПредставленияДляДобавления = ПараметрыПредставления;	
	КонецЕсли;
	
	ПараметраЗапросаФормы = УИ_ПараметрыЗапросаВПараметрыЗапросаФормы(ПараметрыПредставленияДляДобавления);
	ПараметрыОтбора = Новый Структура("Имя");
	Для Каждого ПараметрЗапросаФормы Из ПараметраЗапросаФормы Цикл
		ПараметрыОтбора.Имя = ПараметрЗапросаФормы.Имя;
		Если ПараметрыЗапроса.НайтиСтроки(ПараметрыОтбора).Количество() = 0 Тогда
			ЗаполнитьЗначенияСвойств(ПараметрыЗапроса.Добавить(), ПараметрЗапросаФормы);		
		КонецЕсли;	
	КонецЦикла;
	
КонецПроцедуры

// Вставляет или удаляет код замены представлений в алгоритм перед выполнением.
// Поиск выполняется по комментарию.
// 
// Параметры:
//  Добавить - Булево - Истина - добавить, Ложь - удалить
&НаКлиенте
Процедура УИ_ДобавитьКодЗаменыПредставленийВАлгоритмПередВыполнением(Добавить = Истина)
	
	АлгоритмПередВыполнением = ТекущийАлгоритмПередВыполнением();
	
	ПозицияВставки = УИ_НайтиКодЗаменыПредставленийВТексте(АлгоритмПередВыполнением);
	Если Добавить Тогда
		ВставленКод = Истина;
		
		Если ПозицияВставки = Неопределено Тогда
			АлгоритмПередВыполнением = АлгоритмПередВыполнением
									   + ?(ПустаяСтрока(АлгоритмПередВыполнением), "", Символы.ПС)
									   + УИ_ЧастиКодаЗаменыПредставлений().КодВставки;
		КонецЕсли;
	Иначе
		ВставленКод = Ложь;
		
		Если ПозицияВставки <> Неопределено Тогда
			АлгоритмПередВыполнением = Лев(АлгоритмПередВыполнением, ПозицияВставки.Начало - 1)
									   + Прав(АлгоритмПередВыполнением, СтрДлина(АлгоритмПередВыполнением) - ПозицияВставки.Окончание);
			АлгоритмПередВыполнением = СокрП(АлгоритмПередВыполнением);	
		КонецЕсли;	
	КонецЕсли;
	
	УИ_УстановитьСостояниеВставкиКодаЗаменыПредставлений(ВставленКод);
	
	УИ_РедакторКодаКлиент.УстановитьТекстРедактораЭлементаФормы(ЭтотОбъект,
																Элементы.ТекстАлгоритмПередВыполнением,
																АлгоритмПередВыполнением);

КонецПроцедуры

// Устанавливает состояния наличия кода замены представлений в алгоритме перед выполнением.
// Обновляет пометку кнопки.
// 
// Параметры:
//  Пометка - Неопределено, Булево - Пометка. Если Неопределено, то будет выполнен поиск в тексте алгоритма.
&НаКлиенте
Процедура УИ_УстановитьСостояниеВставкиКодаЗаменыПредставлений(Знач Пометка = Неопределено)
	
	Если Пометка = Неопределено Тогда
		Пометка = УИ_НайтиКодЗаменыПредставленийВТексте(ТекущийАлгоритмПередВыполнением()) <> Неопределено;
	КонецЕсли;
	
	УИ_ВставленКодЗаменыПредставлений = Пометка;
	Элементы.УИ_ЗапросВставитьКодЗаменыПредставлений.Пометка = УИ_ВставленКодЗаменыПредставлений;
	Элементы.УИ_АлгоритмПередВыполнениемВставитьКодЗаменыПредставлений.Пометка = УИ_ВставленКодЗаменыПредставлений;
	
КонецПроцедуры

// Выполняет поиск кода замены представлений в тексте.
// 
// Параметры:
//  ТекстАлгоритма - Строка - Текст алгоритма
// 
// Возвращаемое значение:
//  Неопределено, Структура - Позиция вставленного кода. Если Неопределено, то не найдено:
// * Начало - Число - Позиция первого символа вставки
// * Окончание - Число - Позиция последнего символа вставки
&НаКлиентеНаСервереБезКонтекста
Функция УИ_НайтиКодЗаменыПредставленийВТексте(ТекстАлгоритма)
	
	ЧастиКодаЗамены = УИ_ЧастиКодаЗаменыПредставлений();
	ПозицияНачала = СтрНайти(ТекстАлгоритма, ЧастиКодаЗамены.КомментарийНачало);
	ПозицияОкончания = СтрНайти(ТекстАлгоритма, ЧастиКодаЗамены.КомментарийКонец);
	 
	Если ПозицияНачала > 0
		И ПозицияОкончания > 0 Тогда
		Результат = Новый Структура;
		Результат.Вставить("Начало", ПозицияНачала);
		Результат.Вставить("Окончание", ПозицияОкончания + ПозицияОкончания + СтрДлина(ЧастиКодаЗамены.КомментарийКонец));	
	Иначе
		Результат = Неопределено;
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

// Части кода замены представлений
// 
// Возвращаемое значение:
//  Структура - Части кода:
// * КомментарийНачало - Строка - Комментарий начала вставки
// * КомментарийКонец - Строка - Комментарий окончания вставки
// * КодВставки - Строка - Код алгоритма
&НаКлиентеНаСервереБезКонтекста
Функция УИ_ЧастиКодаЗаменыПредставлений()
	
	Структура = Новый Структура;
	Структура.Вставить("КомментарийНачало", "// + ЗарплатаКадрыПредставления");
	Структура.Вставить("КомментарийКонец", "// - ЗарплатаКадрыПредставления");
	Структура.Вставить("КодВставки", СтрШаблон("%1
											   |ЗарплатаКадрыОбщиеНаборыДанных.ЗаменитьЗапросыКПредставлениямВиртуальныхТаблиц(мЗапрос.Текст, мЗапрос);
											   |%2", Структура.КомментарийНачало, Структура.КомментарийКонец));
	
	Возврат Структура;
	
КонецФункции

// Заменяет в тексте запроса представления виртуальных таблиц на реальные запросы
// 
// Параметры:
//  ТекстЗапроса - Строка - Текст запроса
// 
// Возвращаемое значение:
//  Структура - Структура запроса:
// * Текст - Строка - Текст запроса
// * Параметры - Массив Из Структура - Параметры запроса, подготовленные для формы
&НаСервере
Функция УИ_ЗаменитьЗапросыКПредставлениямВиртуальныхТаблицНаСервере(Знач ТекстЗапроса)
	МодульЗарплатаКадрыОбщиеНаборыДанных = УИ_ОбщегоНазначения.ОбщийМодуль("ЗарплатаКадрыОбщиеНаборыДанных");
	Запрос = Новый Запрос; // Запрос необходим для установки параметров
	Запрос.Текст = ТекстЗапроса;
	МодульЗарплатаКадрыОбщиеНаборыДанных.ЗаменитьЗапросыКПредставлениямВиртуальныхТаблиц(Запрос.Текст, Запрос);
	
	Результат = Новый Структура;
	Результат.Вставить("Текст", Запрос.Текст);
	Результат.Вставить("Параметры", УИ_ПараметрыЗапросаВПараметрыЗапросаФормы(Запрос.Параметры));
	
	Возврат Результат;
КонецФункции

// Формирует описания параметров для помещения в таблицу формы из параметров запроса
// 
// Параметры:
//  пПараметрыЗапроса - Структура - Параметры запроса
// 
// Возвращаемое значение:
//  Массив Из Структура - Параметры запроса для таблицы формы
//@skip-check bsl-variable-name-invalid
&НаСервере
Функция УИ_ПараметрыЗапросаВПараметрыЗапросаФормы(Знач пПараметрыЗапроса)
	
	ПараметрыЗапросаФормы = Новый Массив;
	
	Если пПараметрыЗапроса.Количество() = 0 Тогда
		Возврат ПараметрыЗапросаФормы;		
	КонецЕсли;
	
	ТипКонтейнераСписокЗначений = 1;
	ТипКонтейнераМассив = 2;
	ТипКонтейнераТаблицаЗначений = 3;
	
	ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
	
	Для Каждого ЭлементКоллекции Из пПараметрыЗапроса Цикл
		Если ТипЗнч(ЭлементКоллекции) = Тип("ОписаниеПараметраЗапроса") Тогда
			ЭтоОписаниеПараметраЗапроса = Истина;
			ИмяПараметра = ЭлементКоллекции.Имя;
			ЗначениеПараметра = ЭлементКоллекции.ТипЗначения.ПривестиЗначение();
		Иначе
			ЭтоОписаниеПараметраЗапроса = Ложь;
			ИмяПараметра = ЭлементКоллекции.Ключ;
			ЗначениеПараметра = ЭлементКоллекции.Значение;
		КонецЕсли;
		
		ПараметрЗапроса = Новый Структура;
		ПараметрЗапроса.Вставить("Использовать", Истина);
		ПараметрЗапроса.Вставить("Имя", ИмяПараметра);
		ПараметрЗапроса.Вставить("Значение", "");
		ПараметрЗапроса.Вставить("ТипЗначения", Неопределено);
		ПараметрЗапроса.Вставить("ТипКонтейнера", ПолучитьКодФормыЗначения(ЗначениеПараметра));
		ПараметрЗапроса.Вставить("Контейнер", ОбработкаОбъект.Контейнер_СохранитьЗначение(ЗначениеПараметра));
				
		Если ПараметрЗапроса.ТипКонтейнера = ТипКонтейнераСписокЗначений
			Или ПараметрЗапроса.ТипКонтейнера = ТипКонтейнераМассив Тогда
				
			ТипыЗначений = Новый Массив;

			Если ПараметрЗапроса.ТипКонтейнера = ТипКонтейнераСписокЗначений Тогда
				ЗначенияВМассиве = ЗначениеПараметра.ВыгрузитьЗначения();
			Иначе
				ЗначенияВМассиве = ЗначениеПараметра;
			КонецЕсли;
			
			Для Каждого Значение Из ЗначенияВМассиве Цикл
				ТипЗначения = ТипЗнч(Значение);
				Если ТипыЗначений.Найти(ТипЗначения) = Неопределено Тогда
					ТипыЗначений.Добавить(ТипЗначения);		
				КонецЕсли;
			КонецЦикла;
			
			ПараметрЗапроса.ТипЗначения = Новый ОписаниеТипов(ТипыЗначений);
			ПараметрЗапроса.Значение = ПараметрЗапроса.Контейнер.Представление;
			
		ИначеЕсли ПараметрЗапроса.ТипКонтейнера = ТипКонтейнераТаблицаЗначений Тогда
			ПараметрЗапроса.ТипЗначения = "Таблица значений";
			ПараметрЗапроса.Значение = ПараметрЗапроса.Контейнер.Представление;
		Иначе
			Если ЭтоОписаниеПараметраЗапроса Тогда
				ПараметрЗапроса.ТипЗначения = ЭлементКоллекции.ТипЗначения;
			Иначе
				ПараметрЗапроса.ТипЗначения = ОписаниеТиповПоТипу(ТипЗнч(ЗначениеПараметра));		
			КонецЕсли;
			
			ПараметрЗапроса.Значение = ПараметрЗапроса.Контейнер;
		КонецЕсли;
		
		ПараметрыЗапросаФормы.Добавить(ПараметрЗапроса);
	КонецЦикла;
	
	Возврат ПараметрыЗапросаФормы;
		
КонецФункции

#КонецОбласти

#КонецОбласти

&НаКлиенте
Процедура Команда_ПараметрыЗапросаРядомСТекстом_ВключениеВидимостиРедакторов()
	//Бигфикс https://github.com/cpr1c/tools_ui_1c/issues/481
	УИ_РедакторКодаКлиент.ПереключитьВидимостьРедактора(ЭтотОбъект, "Алгоритм");
	УИ_РедакторКодаКлиент.ПереключитьВидимостьРедактора(ЭтотОбъект, "АлгоритмПередВыполнением");
КонецПроцедуры

#КонецОбласти

